天天看點

Strategy(政策)--對象行為型模式

Strategy(政策)–對象行為型模式

一、意圖

定義一系列的算法,把它們一個個封裝起來,并且使它們可互相替換。本模式使得算法可獨立于使用它的客戶而變化。

二、動機

1.在軟體建構過程中,某些對象使用的算法可能多種多樣,經常改變,如果将這些算法都編碼到對象中,将會使對象變得異常複雜; 而且有時候支援不使用的算法也是一個性能負擔。

2.如何在運作時根據需要透明地更改對象的算法?将算法與對象本身解耦,進而避免上述問題?

三、适用性

1.許多相關的類僅僅是行為有異。“政策”提供了一種用多個行為中的一個行為來配置一個類的方法。

2.需要使用一個算法的不同變體。例如,你可能會定義一些反應不同的空間、時間權衡的算法。當這些變體實作為一個算法的類層次時,可以使用政策模式。

3.算法使用客戶不應該知道的資料。可使用政策模式以避免暴露複雜的、與算法相關的資料結構。

3.一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現。将相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。

四、結構

Strategy(政策)--對象行為型模式

五、效果

1.相關算法系列。 Strategy類層次為Context定義了一系列的可供重用的算法。繼承有利于析取出這些算法中的公共功能。

2.一個替代繼承的方法。 繼承提供了另一種支援多種算法或行為的方法。你可以直接生成一個Context類的子類,進而給它以不同的行為。但這會将行為硬行編制到Context中,而将算法的實作與Context的實作混合起來,進而使Context難以了解,難以維護和難以擴充,而且還不能動态的改變算法。最後得到一堆相關的類,它們之間唯一的差别就是它們所使用的算法或行為。将算法封裝在獨立的Strategy類中使得你可以獨立于其Context改變它,使它易于切換、易于了解、易于擴充。

3.消除了一些條件語句。 Strategy模式提供了用條件語句選擇所需的行為以外的另一種選擇。當不同的行為堆砌在一個類中時。很難避免使用條件語句來選擇合适的行為。将行為封裝在一個個獨立的Strategy類中消除了這些條件語句。

4.實作的選擇。 Strategy模式可以提供相同行為的不同實作。客戶可以根據不同的時間、空間權衡取舍要求不同政策中進行選擇。

5.客戶必須了解不同的Strategy。 本模式有一個潛在的缺點,就是客戶要選擇一個合适的Strategy九必須知道這些Strategy到底有何不同。此時可能不得不向客戶暴露具體的實作問題。是以僅當這些不同行為變體與客戶相關的行為時,才需要使用Strategy模式。

6.Strategy和Context之間的通信開銷。 無論各個Concrete Strategy實作的算法是簡單還是複雜,他們都共享Strategy定義的接口。是以很可能某些ConcreteStrategy不會都用到所有通過這個接口傳遞給它們的資訊;簡單的Concrete Strategy可能不是用呢其中的任何資訊!這就意味着有時Context會建立和初始化一些永遠不會用到的參數。如果存在這樣問題,那麼将需要在Strategy和Context之間進行緊密的耦合。

7.增加了對象的數目。 Strategy增加了一個應用的對象數目。有時你可以将Strategy實作為可供各Context共享的無狀态對象來減少這一個開銷。任何其餘的狀态都由Context維護。Context在每一次對Strategy對象的請求中都将這個狀态傳遞過去。共享的Strategy不應在各次調用之間維護狀态。

六、實作

1.定義Strategy和Context接口。

2.将Strategy作為模闆參數。

3.使Strategy對象成為可選的。

七、要點總結

1.Strategy及其子類為元件提供了一系列可重用的算法,進而可以使得類型在運作時友善地根據需要在各個算法之間進行切換。

2.Strategy模式提供了用條件判斷語句以外的另一種選擇,消除條件判斷語句,就是在解耦合。含有許多條件判斷語句的代碼通常都需要Strategy模式。

3.如果Strategy對象沒有執行個體變量,那麼各個上下文可以共享同一個Strategy對象,進而節省對象開銷。

八、相關模式

Flyweight:Strategy對象經常是很好的輕量級對象。

九、舉例說明

解一個方程可有多種方法,每個方法都是一種政策。

本文為李建忠設計模式視訊的筆記以及《設計模式-可複用面向對象的軟體的基礎》和自己的部分見解

繼續閱讀