演算法的封裝與切換——策略模式(二)

Liuwei-Sunny發表於2012-08-01

24.2 策略模式概述

      在策略模式中,我們可以定義一些獨立的類來封裝不同的演算法,每一個類封裝一種具體的演算法,在這裡,每一個封裝演算法的類我們都可以稱之為一種策略(Strategy),為了保證這些策略在使用時具有一致性,一般會提供一個抽象的策略類來做規則的定義,而每種演算法則對應於一個具體策略類。

      策略模式的主要目的是將演算法的定義與使用分開,也就是將演算法的行為和環境分開,將演算法的定義放在專門的策略類中,每一個策略類封裝了一種實現演算法,使用演算法的環境類針對抽象策略類進行程式設計,符合“依賴倒轉原則”。在出現新的演算法時,只需要增加一個新的實現了抽象策略類的具體策略類即可。策略模式定義如下:

策略模式(Strategy Pattern):定義一系列演算法類,將每一個演算法封裝起來,並讓它們可以相互替換,策略模式讓演算法獨立於使用它的客戶而變化,也稱為政策模式(Policy)。策略模式是一種物件行為型模式。

      策略模式結構並不複雜,但我們需要理解其中環境類Context的作用,其結構如圖24-1所示:

      在策略模式結構圖中包含如下幾個角色:

      ● Context(環境類):環境類是使用演算法的角色,它在解決某個問題(即實現某個方法)時可以採用多種策略。在環境類中維持一個對抽象策略類的引用例項,用於定義所採用的策略。

      ● Strategy(抽象策略類):它為所支援的演算法宣告瞭抽象方法,是所有策略類的父類,它可以是抽象類或具體類,也可以是介面。環境類通過抽象策略類中宣告的方法在執行時呼叫具體策略類中實現的演算法。

      ● ConcreteStrategy(具體策略類):它實現了在抽象策略類中宣告的演算法,在執行時,具體策略類將覆蓋在環境類中定義的抽象策略類物件,使用一種具體的演算法實現某個業務處理。

 

思考

一個環境類Context能否對應多個不同的策略等級結構?如何設計?

      策略模式是一個比較容易理解和使用的設計模式,策略模式是對演算法的封裝,它把演算法的責任和演算法本身分割開,委派給不同的物件管理。策略模式通常把一個系列的演算法封裝到一系列具體策略類裡面,作為抽象策略類的子類。在策略模式中,對環境類和抽象策略類的理解非常重要,環境類是需要使用演算法的類。在一個系統中可以存在多個環境類,它們可能需要重用一些相同的演算法。

      在使用策略模式時,我們需要將演算法從Context類中提取出來,首先應該建立一個抽象策略類,其典型程式碼如下所示:

abstract class AbstractStrategy {
    public abstract void algorithm(); //宣告抽象演算法
}

       然後再將封裝每一種具體演算法的類作為該抽象策略類的子類,如下程式碼所示:

class ConcreteStrategyA extends AbstractStrategy {
    //演算法的具體實現
    public void algorithm() {
       //演算法A
    }
}

      其他具體策略類與之類似,對於Context類而言,在它與抽象策略類之間建立一個關聯關係,其典型程式碼如下所示:

class Context {
private AbstractStrategy strategy; //維持一個對抽象策略類的引用

    public void setStrategy(AbstractStrategy strategy) {
        this.strategy= strategy;
    }

    //呼叫策略類中的演算法
    public void algorithm() {
        strategy.algorithm();
    }
}

      在Context類中定義一個AbstractStrategy型別的物件strategy,通過注入的方式在客戶端傳入一個具體策略物件,客戶端程式碼片段如下所示:

……
Context context = new Context();
AbstractStrategy strategy;
strategy = new ConcreteStrategyA(); //可在執行時指定型別
context.setStrategy(strategy);
context.algorithm();
……

      在客戶端程式碼中只需注入一個具體策略物件,可以將具體策略類類名儲存在配置檔案中,通過反射來動態建立具體策略物件,從而使得使用者可以靈活地更換具體策略類,增加新的具體策略類也很方便。策略模式提供了一種可插入式(Pluggable)演算法的實現方案

【作者:劉偉  http://blog.csdn.net/lovelion

相關文章