設計模式-策略模式-運算示例

策略模式

策略模式-行爲型模式。
在策略模式中,實例代碼創建表示各種策略的對象和一個行爲隨着策略對象改變而改變的context對象。策略對象改變context對象的執行算法。
目的和手段:將相似的算法封裝成類,使他們可以任意的替換,來解決使用if…else多重條件選擇語句所帶來的複雜和難以維護。
關鍵代碼:所有封裝成類的算法,實現同一個接口。
注意事項:如果一個系統的策略多於四個,就需要考慮使用混合模式,解決策略類膨脹的問題。
參考鏈接:https://www.runoob.com/design-pattern/strategy-pattern.html

代碼分析(先看代碼示例):

  1. 首先,要明確,策略分析其實是爲了代替多重選擇語句的複雜型,就像裝飾器模式是繼承的一種替代模式(這裏說的“替代”,不是指技術上的替代,而是指繼承能實現的功能,用策略模式來實現更簡潔更優雅)。
  2. 實例代碼邏輯很清晰,重點在於Context類中的Strategy實例,這個千萬不能忘記,因爲有了這個實例變量,才讓各個策略對象可以改變context的行爲。在執行context的executeStrategy()方法時,在初始化context時,傳入的不同策略類型參數,決定了executeStrategy()方法實際調用的代碼位置。
  3. UML類圖如下:
    策略模式

示例代碼

// 步驟1、創建策略接口
interface Strategy {
    public int doOperation(int num1, int num2);
}

// 步驟2、實現策略接口的類
class OperationAdd implements Strategy{
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

class OperationSubstract implements Strategy{
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

class OperationMultiply implements Strategy{
    @Override
    public int doOperation(int num1, int num2) {
        return num1 * num2;
    }
}

// 重點! 步驟3、創建Context類,隨着策略對象的不同而改變行爲,所以需要把Strategy作爲它的實例變量
class Context {
    private Strategy strategy; // 關鍵點

    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2){
        return strategy.doOperation(num1, num2);
    }
}

// 步驟4、測試
public class StrategyPatternDemo {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationSubstract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationMultiply());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章