Strategy(策略)--对象行为型模式
Strategy(策略)–對象行為型模式
一、意圖
定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。
二、動機
1.在軟件構建過程中,某些對象使用的算法可能多種多樣,經常改變,如果將這些算法都編碼到對象中,將會使對象變得異常復雜; 而且有時候支持不使用的算法也是一個性能負擔。
2.如何在運行時根據需要透明地更改對象的算法?將算法與對象本身解耦,從而避免上述問題?
三、適用性
1.許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的方法。
2.需要使用一個算法的不同變體。例如,你可能會定義一些反應不同的空間、時間權衡的算法。當這些變體實現為一個算法的類層次時,可以使用策略模式。
3.算法使用客戶不應該知道的數據。可使用策略模式以避免暴露復雜的、與算法相關的數據結構。
3.一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的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對象經常是很好的輕量級對象。
九、舉例說明
解一個方程可有多種方法,每個方法都是一種策略。
本文為李建忠設計模式視頻的筆記以及《設計模式-可復用面向對象的軟件的基礎》和自己的部分見解
總結
以上是生活随笔為你收集整理的Strategy(策略)--对象行为型模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: State(状态)--对象行为型模式
- 下一篇: Template Method(模板方法