天天看點

Head First設計模式之政策模式

  這是學習的第一個設計模式,而書中寫的執行個體相對比較複雜,參考了網上的文章進行總結

   政策模式(strategy pattern): 定義了算法族, 分别封閉起來, 讓它們之間可以互相替換, 此模式讓算法的變化獨立于使用算法的客戶.

   政策模式是針對一組算法,将每個算法封裝到具有公共接口的獨立的類中,進而使它們可以互相替換。政策模式使得算法可以在不影響到用戶端的情況下發生變化。

Head First設計模式之政策模式

  找出應用中需要變化之處,把它們獨立出來、不要和那些不需要變化的代碼混在一起

  針對接口程式設計,而不是針對實作程式設計

  多用組合、少用繼承

政策模式是對算法的包裝,是把使用算法的責任和算法本身分割開,委派給不同的對象負責。政策模式通常把一系列的算法包裝到一系列的政策類裡面。用一句話慨括政策模式就是——“将每個算法封裝到不同的政策類中,使得它們可以互換”。

下面是政策模式的結構圖:

Head First設計模式之政策模式

該模式涉及到三個角色:

環境角色(Context):持有一個Strategy類的引用

抽象政策角色(Strategy):這是一個抽象角色,通常由一個接口或抽象類來實作。此角色給出所有具體政策類所需實作的接口。

具體政策角色(ConcreteStrategy):包裝了相關算法或行為。

以下以計算個人所得稅為例

 關于其他例子

  被測試網站是一個針對全球很多市場的一個網站,有時同一個測試點,需要我們配置一下網絡代理和其它不同的設定來模拟當地市場。

    http://www.cnblogs.com/heqichang/archive/2012/12/13/2815927.html

  

在下面的情況下可以考慮使用政策模式:

一個系統需要動态地在幾種算法中選擇一種的情況下。那麼這些算法可以包裝到一個個具體的算法類裡面,并為這些具體的算法類提供一個統一的接口。

如果一個對象有很多的行為,如果不使用合适的模式,這些行為就隻好使用多重的if-else語句來實作,此時,可以使用政策模式,把這些行為轉移到相應的具體政策類裡面,就可以避免使用難以維護的多重條件選擇語句,并展現面向對象涉及的概念。

政策類之間可以自由切換。由于政策類都實作同一個接口,是以使它們之間可以自由切換。

易于擴充。增加一個新的政策隻需要添加一個具體的政策類即可,基本不需要改變原有的代碼。

避免使用多重條件選擇語句,充分展現面向對象設計思想。

 用戶端必須知道所有的政策類,并自行決定使用哪一個政策類。

 政策模式會造成很多的政策類。

繼續閱讀