簡(jiǎn)介
策略模式是屬于行為模式的,在策略模式中誉券,一個(gè)類的行為或算法可以在運(yùn)行時(shí)更改。其思想是針對(duì)一組算法刊愚,將每一種算法都封裝到具有共同接口的獨(dú)立的類中踊跟,從而是它們可以相互替換。策略模式的最大特點(diǎn)是使得算法可以在不影響客戶端的情況下發(fā)生變化鸥诽,從而改變不同的功能商玫。
優(yōu)點(diǎn)
- 算法可以自由切換
- 避免使用多重判斷條件
- 擴(kuò)展性良好
缺點(diǎn)
- 策略類會(huì)增多
- 所有策略類都需要對(duì)外暴露
使用場(chǎng)景
- 使用在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為牡借,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為决帖。
- 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。
- 如果一個(gè)對(duì)象有很多的行為蓖捶,如果不用恰當(dāng)?shù)哪J降鼗兀@些行為只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)。
組成
- 抽象策略角色:是一個(gè)抽象的角色,通常情況下使用接口或者抽象類去實(shí)現(xiàn)刻像。
- 具體策略角色:包裝了具體的算法和行為畅买。
- 環(huán)境角色:內(nèi)部持有一個(gè)抽象角色的引用,給客戶端調(diào)用细睡。
UML類圖
實(shí)現(xiàn)步驟
- 1.定義一個(gè)抽象策略角色谷羞,為策略對(duì)象定義一個(gè)公共的接口
- 2.編寫(xiě)具體策略角色,實(shí)現(xiàn)上面的接口
- 3.定義環(huán)境角色溜徙,內(nèi)部持有一個(gè)策略類的引用湃缎。
示例
小明去上學(xué)有很多種方式可以選擇,例如有步行蠢壹,私家車(chē)嗓违,自行車(chē)等方式,現(xiàn)在將這個(gè)例子來(lái)講解策略模式图贸。
- 定義一個(gè)抽象的接口Strategy蹂季,是一個(gè)抽象策略的角色。
/**
* 抽象策略者角色
*/
public interface Strategy {
void goToSchool();
}
- 2.定義各個(gè)的具體策略者疏日。
/**
* 具體的策略者偿洁,實(shí)現(xiàn)抽象策略者的接口
*/
class WalkStrategy implements Strategy{
@Override
public void goToSchool() {
System.out.println("走路去上學(xué)。");
}
}
class BicycleStrategy implements Strategy{
@Override
public void goToSchool() {
System.out.println("騎自行車(chē)去上學(xué)沟优。");
}
}
class CarStrategy implements Strategy{
@Override
public void goToSchool() {
System.out.println("搭車(chē)去上學(xué)涕滋。");
}
}
- 3.定義環(huán)境角色,通過(guò)聚合的方式與Strategy進(jìn)行關(guān)聯(lián)挠阁,編寫(xiě)提供給客戶端調(diào)用的方法何吝。
/**
* 環(huán)境角色,提供給客戶進(jìn)行調(diào)用
*/
public class Context {
private Strategy mStrategy;
public Context(Strategy strategy){
mStrategy=strategy;
}
/**
* 提供給客戶端調(diào)用的方法
*/
public void goToSchoolMethod(){
mStrategy.goToSchool();
}
}
- 4.具體的使用
public class StrategyPattern {
public static void main(String[] args){
Context context1=new Context(new WalkStrategy());
context1.goToSchoolMethod();
Context context2=new Context(new BicycleStrategy());
context2.goToSchoolMethod();
Context context3=new Context(new CarStrategy());
context3.goToSchoolMethod();
}
}
輸出結(jié)果:
走路去上學(xué)鹃唯。
騎自行車(chē)去上學(xué)。
搭車(chē)去上學(xué)瓣喊。