博客原文地址html
在策略模式(Strategy Pattern)中,一個類的行爲或其算法能夠在運行時更改。這種類型的設計模式屬於行爲型模式。簡單理解就是一組算法,能夠互換,再簡單點策略就是封裝算法。java
意圖 定義一系列的算法,把它們一個個封裝起來, 而且使它們可相互替換。git
主要解決 在有多種算法類似的狀況下,使用 if...else 所帶來的複雜和難以維護。github
什麼時候使用 一個系統有許多許多類,而區分它們的只是他們直接的行爲。算法
如何解決 將這些算法封裝成一個一個的類,任意地替換。設計模式
主要角色ide
UMLthis
應用實例spa
優勢 一、算法能夠自由切換。 二、避免使用多重條件判斷。 三、擴展性良好。設計
缺點 一、策略類會增多。 二、全部策略類都須要對外暴露。
使用場景
注意事項: 若是一個系統的策略多於四個,就須要考慮使用混合模式,解決策略類膨脹的問題。
simple1包,主要對操做行爲包裝了加減乘除方法。
@Slf4j
public class Application {
public static void main(String[] args) {
Context context = new Context(new AddStrategy());
log.info("10 + 5 = {}", context.executeStrategy(10, 5));
context.setStrategy(new SubstractStrategy());
log.info("10 - 5 = {}", context.executeStrategy(10, 5));
context.setStrategy(new MultiplyStrategy());
log.info("10 * 5 = {}", context.executeStrategy(10, 5));
context.setStrategy(new DivideStrategy());
log.info("10 / 5 = {}", context.executeStrategy(10, 5));
}
}
複製代碼
執行結果
simple2包描述,主要對出行方式的包裝,包裝了3種出行方式,
執行類
public class TravelApplication {
public static void main(String[] args) {
Context context = new Context(new BusStrategy());
context.executeStrategy("老王");
context.setStrategy(new BicycleStrategy());
context.executeStrategy("老張");
context.setStrategy(new WalkStrategy());
context.executeStrategy("老李");
}
}
複製代碼
執行結果
策略上下文
@Data
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
/** * 出行 * * @return */
public void executeStrategy(String name) {
strategy.travel(name);
}
}
複製代碼
抽象策略
public interface Strategy {
/** * 出現方法 * * @return */
void travel(String name);
}
複製代碼