策略模式(附Head First策略模式的C++代碼實現)

當你看到文章標題的時候,一般就知道了什麼事策略模式,不過我還是要囉嗦一下,那麼,先給出策略模式的定義吧。

策略模式:軟件設計模式的一種,策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。

問題:
一個模擬鴨子的遊戲,即有各種各樣的鴨子,具有不同的行爲,有的鴨子可以飛,有的不可以飛,並且叫聲也不同,還有不會叫的鴨子。
如果不知道策略模式的話,那麼我們大約有兩種比較容易想到的方法來解決這個問題:
1.寫一個鴨子的基類,但是這樣做的缺點很明顯,那就是我們需要每一隻鴨子類都必須覆蓋基類的函數(方法)。
2.使用接口(C++還沒有接口- -!),這樣做的缺點就是每一隻鴨子類中都要寫對應的方法,並且不容易更改。

於是,這裏就用到了策略模式,定義FlyBehavior與QuackBehavior行爲接口,並且用這兩個接口定義兩個變量作爲基類的成員變量,而我們創造一組具體的行爲類來實現FlyBehavior與QuackBehavior接口,這樣,我們就可以讓鴨子的某個成員變量(兩個接口類型的)來調用每個鴨子對應的方法,這樣我們大大減少了代碼量,而且使得鴨子改變行爲成爲了可能(比如本來呱呱叫,突然得病啞了)。

代碼較多,知道有些人不喜歡看冗長的文章,於是我決定把代碼放到文章最後的鏈接裏,需要的可以去下載,代碼不多,命名也比較規範,看起來應該很容易明白。

那接着說策略模式吧,先放一張uml圖:
策略模式uml

設計原則:

  1. 代碼封裝,即相同的代碼要獨立出來。
  2. 針對接口編程。
  3. 多用組合,少用繼承

優缺點:
優點:
1. 策略模式提供了管理相關的算法族的辦法。
2. 策略模式提供了可以替換繼承關係的辦法。
3. 使用策略模式可以避免使用多重條件轉移語句。
缺點:
1.客戶端必須知道所有的策略類。
2.策略模式造成很多的策略類。

具體請看百度百科策略模式,感覺總結的優缺點還不錯。

最後,給出一段很短的Java代碼實現最簡單的策略模式(不想看的請無視- -!):

//StrategyExample test application
class StrategyExample {
    public static void main(String[] args) {
        Context context;

        // Three contexts following different strategies
        context = new Context(new FirstStrategy());
        context.execute();

        context = new Context(new SecondStrategy());
        context.execute();

        context = new Context(new ThirdStrategy());
        context.execute();
    }
}

// The classes that implement a concrete strategy should implement this

// The context class uses this to call the concrete strategy
interface Strategy {
    void execute();
}

// Implements the algorithm using the strategy interface
class FirstStrategy implements Strategy {
    public void execute() {
        System.out.println("Called FirstStrategy.execute()");
    }
}

class SecondStrategy implements Strategy {
    public void execute() {
        System.out.println("Called SecondStrategy.execute()");
    }
}

class ThirdStrategy implements Strategy {
    public void execute() {
        System.out.println("Called ThirdStrategy.execute()");
    }
}

// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object
class Context {
    Strategy strategy;
    // Constructor
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void execute() {
        this.strategy.execute();
    }
}

下載地址:http://download.csdn.net/detail/u013679882/8579757
歡迎指出不足

發佈了24 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章