java解决策略膨胀_折腾Java设计模式之策略模式
簡介
在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設計模式屬于行為型模式。簡單理解就是一組算法,可以互換,再簡單點策略就是封裝算法。
意圖 定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。
主要解決 在有多種算法相似的情況下,使用 if...else 所帶來的復雜和難以維護。
何時使用 一個系統有許多許多類,而區(qū)分它們的只是他們直接的行為。
如何解決 將這些算法封裝成一個一個的類,任意地替換。
主要角色
上下文Context,擁有一個Strategy的引用
抽象策略Strategy,往往是一個接口(占大部分情況)或者抽象類,通常提供各種具體策略的接口
具體策略,這就是重點了,封裝了各種具體的算法
UML
應用實例
諸葛亮的錦囊妙計,每一個錦囊就是一個策略;
旅行的出游方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略;
JAVA AWT 中的 LayoutManager;
優(yōu)點 1、算法可以自由切換。 2、避免使用多重條件判斷。 3、擴展性良好。
缺點 1、策略類會增多。 2、所有策略類都需要對外暴露。
使用場景
如果在一個系統里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。
一個系統需要動態(tài)地在幾種算法中選擇一種。
如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。
注意事項: 如果一個系統的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題。
項目描述
1.操作行為
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));
}
}
執(zhí)行結果
2.出現方式
simple2包描述,主要對出行方式的包裝,包裝了3種出行方式,
執(zhí)行類
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("老李");
}
}
執(zhí)行結果
策略上下文
@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);
}
參考
總結
以上是生活随笔為你收集整理的java解决策略膨胀_折腾Java设计模式之策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python seek tell_PYT
- 下一篇: 为什么要叫长虹玻璃呢_中和热测定实验中为