1. 程式人生 > 實用技巧 >設計模式-策略模式

設計模式-策略模式

策略模式中一個類的行為可以在執行的時候進行更改,我們需要定義一個策略的介面,讓所有的具體策略實現這個介面,然後封裝一個可以執行策略的物件,可以通過傳入不同的策略,執行不同的演算法;

  1. 意圖:定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。
  2. 主要解決:在有多種演算法相似的情況下,使用 if...else 所帶來的複雜和難以維護。
  3. 何時使用:一個系統有許多許多類,而區分它們的只是他們直接的行為。
  4. 如何解決:將這些演算法封裝成一個一個的類,任意地替換。
  5. 關鍵程式碼:實現同一個介面。

這裡舉例借鑑了《您的設計模式》中諸葛亮給趙雲的錦囊妙計,讓趙雲去東吳的過程中拆開;

下面看一下類圖:

實現策略模式的有以下幾個步驟:

    • 定義一個策略介面
    • 讓能夠執行的具體策略實現這個介面
    • 封裝一個可以執行策略的物件
    • 呼叫對應的策略

1、定義一個策略介面

package com.dongl.strategy;

/**
 * 定義一個的策略
 */
public interface Strategy {

    //每個錦囊妙計都是一個可執行的演算法
    public void operate();
}

2、具體策略實現策略介面

第一個策略:

package com.dongl.strategy;

public class BackDoor implements Strategy{
    @Override
    
public void operate() { System.out.println("找喬國老幫忙,讓吳國太給孫權施加壓力"); } }

第二個策略:

package com.dongl.strategy;

public class BlockEnemy implements Strategy {
    @Override
    public void operate() {
        System.out.println("孫夫人斷後,擋住追兵");
    }
}

第三個策略:

package com.dongl.strategy;

public
class GivenGreenLight implements Strategy { @Override public void operate() { System.out.println("求吳國太開個綠燈,放行!"); } }

3、封裝一個可以執行策略的

package com.dongl.strategy;

/**
 * 計謀有了,那還要有錦囊
 */
public class Context {
    //建構函式,你要使用那個妙計
    private Strategy straegy;
    public Context(Strategy strategy){
        this.straegy = strategy;
    }
    //使用計謀了,看我出招了
    public void operate(){
        this.straegy.operate();
    }
}

4、呼叫對應策略

package com.dongl.strategy;

public class ZhaoYun {
    /**
     * 趙雲出場了,他根據諸葛亮給他的交代,依次拆開妙計
     */
    public static void main(String[] args) {
        Context context;

        System.out.println("-----------剛剛到吳國的時候拆第一個-------------");
        context = new Context(new BackDoor()); //拿到妙計
        context.operate(); //拆開執行

        System.out.println("-----------劉備樂不思蜀了,拆第二個了-------------");
        context = new Context(new GivenGreenLight());
        context.operate(); //執行了第二個錦囊了

        System.out.println("-----------孫權的小兵追了,咋辦?拆第三個 -------------");
        context = new Context(new BlockEnemy());
        context.operate(); //孫夫人退兵
    }
}