1. 程式人生 > >策略模式筆記

策略模式筆記

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 class
ConcreteStrategyB 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; } ? public
Strategy 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(); } }

總結

策略模式主要是找出應用中可能需要變化之處,把它們獨立出來進行封裝,不和那些不需要變化的代碼混在一起。

這樣可以獨立出最小的部分來進行復用,避免了有很多的將易變和不變部分混合在一起的實現類,導致出現重復代碼的情況。

同時策略模式符合開-閉原則,對擴展開發,對修改關閉,當有新的策略出現的時候,只要添加一個對應的繼承策略接口的具體類即可,不需修改其他策略。

策略模式筆記