模式定義
定義一些列的算法,吧他們一個個封裝起來拆融,并且使他們克相互替換染突。本模式使得算法可獨立于使用它的客戶而變化。
模式結構
代碼實現
interface Strategy {
public void doSomething();
}
class ConcreteStrategy1 implements Strategy {
public void doSomething() {
System.out.println("具體策略1");
}
}
class ConcreteStrategy2 implements Strategy {
public void doSomething() {
System.out.println("具體策略2");
}
}
class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public void execute(){
strategy.doSomething();
}
}
public class Client {
public static void main(String[] args){
Context context;
System.out.println("-----執(zhí)行策略1-----");
context = new Context(new ConcreteStrategy1());
context.execute();
System.out.println("-----執(zhí)行策略2-----");
context = new Context(new ConcreteStrategy2());
context.execute();
}
}
模式的優(yōu)缺點
優(yōu)點
策略模式提供了對“開閉原則”的完美支持姻僧,用戶可以在不修改原有系統(tǒng)的基礎上選擇算法或行為规丽,也可以靈活地增加新的算法或行為。
策略模式提供了管理相關的算法族的辦法撇贺。
策略模式提供了可以替換繼承關系的辦法赌莺。
使用策略模式可以避免使用多重條件轉移語句。
缺點
必須對客戶端(調用者)暴露所有的策略類松嘶,因為使用哪種策略是由客戶端來決定的艘狭。
維護各個策略類會給開發(fā)帶來額外開銷,策略模式將造成產生很多策略類翠订。
思考
模式本質:分離算法巢音,選擇實現。
開發(fā)中的應用場景
幾個類的主要邏輯相同尽超,只在部分邏輯的算法和行為上稍有區(qū)別的情況官撼。
有幾種相似的行為,或者說算法似谁,客戶端需要動態(tài)地決定使用哪一種傲绣,那么可以使用策略模式,將這些算法封裝起來供客戶端調用巩踏。