策略模式筆記
阿新 • • 發佈:2017-05-18
blog mar 導致 sys rate cut html 實現 ring
定義
策略模式是一個在可以在運行時選擇算法行為的設計模式。
策略模式:
-
定義了一個算法族
-
封裝每個算法
-
族內的算法可以相互替換
此模式讓算法的變化獨立於使用算法的客戶。使用策略模式時,我們可以通過輸入數據、數據的類型或者其他可以識別的因素來選擇不同的算法,這些因素我們直到運行時才能獲取到。
比如不同的薪資有不同的個人所得稅算法,購物時花費不同的價格有不同的優惠策略,交稅在不同國家有不同的計算方法等等。我們可以定義一系列對應的策略算法,之後通過個人薪資、花費的價格、所在的地區,選擇對應的策略進行計算。
使用
定義一個策略接口和幾個實現此接口的類,客戶端持有一個策略接口,在運行時根據輸入數據等信息選擇對應的具題策略賦值給接口,之後執行策略接口的方法(即對應的具體實現類中實現的方法)。
對於不熟悉上面UML的可以閱讀深入淺出UML類圖和看懂UML類圖和時序圖了解一下。
代碼(Java)
// 策略接口 public interface Strategy { void execute(); } ? // 具體策略類A public class ConcreteStrategyA implements Strategy { @Override public void execute() { System.out.println("This is ConcreteStrategyA"); } } ? // 具體策略類B public classConcreteStrategyB implements Strategy { @Override public void execute() { System.out.println("This is ConcreteStrategyB"); } } ? // 用戶類 public class Context { private Strategy strategy; ? public Context(Strategy strategy) { this.strategy = strategy; } ? publicStrategy getStrategy() { return strategy; } ? public void setStrategy(Strategy strategy) { this.strategy = strategy; } ? // 用戶方法,執行具體賦值的策略的計算方法 public void execute() { System.out.println("context execute"); strategy.execute(); } ? public static void main(String[] args) { Context context = new Context(new ConcreteStrategyA()); context.execute(); ? // 可以根據輸入的數據等信息進行判斷,設置對應的具體策略來執行 context.setStrategy(new ConcreteStrategyB()); context.execute(); } }
總結
策略模式主要是找出應用中可能需要變化之處,把它們獨立出來進行封裝,不和那些不需要變化的代碼混在一起。
這樣可以獨立出最小的部分來進行復用,避免了有很多的將易變和不變部分混合在一起的實現類,導致出現重復代碼的情況。
同時策略模式符合開-閉原則,對擴展開發,對修改關閉,當有新的策略出現的時候,只要添加一個對應的繼承策略接口的具體類即可,不需修改其他策略。
策略模式筆記