天天看點

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

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】

繼續閱讀