JavaStrategyPattern(策略模式)

凌浩雨發表於2017-09-11

在策略模式(Strategy Pattern)中,一個類的行為或其演算法可以在執行時更改。這種型別的設計模式屬於行為型模式。
在策略模式中,我們建立表示各種策略的物件和一個行為隨著策略物件改變而改變的 context 物件。策略物件改變 context 物件的執行演算法。

關鍵程式碼:實現同一個介面。

優點: 1、演算法可以自由切換。 2、避免使用多重條件判斷。 3、擴充套件性良好。
缺點: 1、策略類會增多。 2、所有策略類都需要對外暴露。

注意事項:如果一個系統的策略多於四個,就需要考慮使用混合模式,解決策略類膨脹的問題。

  1. 建立一個介面。
/**
 * 1. 建立一個介面
 * @author mazaiting
 */
public interface Strategy {
    /**
     * 演算法
     */
    int doOperation(int num1, int num2);
}
  1. 建立實現介面的實體類。
/**
 * 2. 建立實現介面的實體類。
 * @author mazaiting
 */
public class OperationAdd implements Strategy{

    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }

}


/**
 * 2. 建立實現介面的實體類。
 * @author mazaiting
 */
public class OperationSub implements Strategy{

    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }

}

/**
 * 2. 建立實現介面的實體類。
 * @author mazaiting
 */
public class OperationMult implements Strategy{

    public int doOperation(int num1, int num2) {
        return num1 * num2;
    }

}
  1. 建立Context類。
/**
 * 3. 建立 Context 類。
 * @author mazaiting
 */
public class Context {
    private Strategy strategy;
    
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }   
}
  1. 使用 Context 來檢視當它改變策略 Strategy 時的行為變化。
/**
 * 4. 使用 Context 來檢視當它改變策略 Strategy 時的行為變化。
 * @author mazaiting
 */
public class Client {

    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 OperationSub());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationMult());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    }
}
  1. 列印結果
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50


相關文章