使用模板方法模式,可以進行共有方法的抽取,快速複用和擴展。策略模式也是一種行爲型模式,做用和模板方法模式同樣。你們對 if-else
嵌套過多的處理方法,最多見的手段就是利用策略模式。算法
定義一組算法,將每一個算法都封裝起來,而且使它們之間能夠互換markdown
//抽象的策略角色
public interface Strategy{
//策略模式的運算規則
public void doSomething();
}
//具體的策略角色
public class ConcreteStrategy1 implements Strategy{
public void doSomething(){
System.out.println("具體策略1的規則");
}
}
public class ConcreteStrategy2 implements Strategy{
public void doSomething(){
System.out.println("具體策略2的規則");
}
}
//封裝角色
public class Context{
//抽象策略
private Strategy strategy = null;
//構造函數設置具體策略
public Context(Strategy _strategy){
this.strategy = _strategy;
}
public void doAnyThing(){
this.strategy.doSomething();
}
}
複製代碼
高層的模塊調用很簡單,須要知道使用哪一個策略,構建出它的對象函數
public class Client{
public static void main(String[] args){
//聲明一個具體策略
Strategy strategy = new ConcreteStrategy1();
Context context = new Context(strategy);
//執行
context.doAnyThing();
}
}
複製代碼
只但願客戶端選擇已經封裝好的算法場景而不用關心算法實現細節this
多個類只有在算法或行爲上稍有不一樣的場景spa
算法須要自由切換的場景code
須要屏蔽算法規則的場景orm
分離使用策略和建立策略的場景對象
算法能夠自由切換it
避免使用多重條件判斷io
擴展性好
策略類數量增多,複用可能性小
全部的策略類須要對外暴露
修改代碼時,須要瞭解每一個策略類,對使用場景進行修改