第二講 策略模式
動(dòng)機(jī):
在軟件的構(gòu)建過程中,某些對(duì)象使用的算法可能多種多樣,經(jīng)常改變,如果將這些算法都編碼到對(duì)象中,將會(huì)使對(duì)象變的異常復(fù)雜,而且有時(shí)候支持不使用的算法也是一種負(fù)擔(dān)。
如果在運(yùn)行時(shí)根據(jù)需要透明的更改對(duì)象的算法?將算法與對(duì)象本身解耦從而避免上述問題?
代碼示例

這里SalesOrder對(duì)象就和具體的計(jì)稅算法綁定到了一起,通常見到else if語句出現(xiàn),就意味著需要重構(gòu)。如果現(xiàn)在希望添加有一種新的國(guó)家稅法,就要修改TaxBase遺以及SalesOrder。這就和“開閉原則”想違背了,該原則要求對(duì)拓展開放、對(duì)更改封閉。類模塊應(yīng)該用拓展的方式應(yīng)對(duì)今后的變化。如何在SalesOrder中消除掉else if,將其與具體的計(jì)稅算法解耦合?

SalesOrder類的寫法也要相應(yīng)的發(fā)生變化:

通過封裝、多態(tài)技術(shù),將不同算法抽象成TaxStrategy的派生類,并實(shí)現(xiàn)計(jì)算相應(yīng)稅法的虛函數(shù),以此來將SalesOrder與具體的稅法算法解耦合。
模式定義
定義一系列算法,把它們一個(gè)個(gè)封裝起來,并且使它們可互相替換。該模式使得算法可以獨(dú)立于使用它的客戶程序而變化?!对O(shè)計(jì)模式》
結(jié)構(gòu)

其中Context和Strategy可以在Strategy的子類發(fā)生變的時(shí)候保持穩(wěn)定、實(shí)現(xiàn)可復(fù)用
要點(diǎn)總結(jié)
Strategy及其子類為組件提供了一系列可重用的算法,從而使得類型在運(yùn)行時(shí)方便的根據(jù)需要在各個(gè)算法之間進(jìn)行切換。
策略模式提供了用條件判斷語句以外的另一種選擇,消除條件判斷語句,就是在解耦合。含有許多條件判斷語句的代碼通常都需要Strategy模式。
如果Strategy對(duì)象沒有實(shí)例變量,那么各個(gè)上下文可以共享同一個(gè)Strategy對(duì)象,從而節(jié)省對(duì)象開銷。