第二講 策略模式
動機:
在軟件的構建過程中,某些對象使用的算法可能多種多樣谴轮,經常改變朽寞,如果將這些算法都編碼到對象中识窿,將會使對象變的異常復雜,而且有時候支持不使用的算法也是一種負擔脑融。
如果在運行時根據(jù)需要透明的更改對象的算法喻频?將算法與對象本身解耦從而避免上述問題?
代碼示例
這里SalesOrder對象就和具體的計稅算法綁定到了一起肘迎,通常見到else if語句出現(xiàn)甥温,就意味著需要重構。如果現(xiàn)在希望添加有一種新的國家稅法妓布,就要修改TaxBase遺以及SalesOrder姻蚓。這就和“開閉原則”想違背了,該原則要求對拓展開放匣沼、對更改封閉狰挡。類模塊應該用拓展的方式應對今后的變化。如何在SalesOrder中消除掉else if,將其與具體的計稅算法解耦合加叁?
SalesOrder類的寫法也要相應的發(fā)生變化:
通過封裝倦沧、多態(tài)技術,將不同算法抽象成TaxStrategy的派生類它匕,并實現(xiàn)計算相應稅法的虛函數(shù)展融,以此來將SalesOrder與具體的稅法算法解耦合。
模式定義
定義一系列算法豫柬,把它們一個個封裝起來告希,并且使它們可互相替換。該模式使得算法可以獨立于使用它的客戶程序而變化轮傍≡荼ⅲ———《設計模式》
結構
其中Context和Strategy可以在Strategy的子類發(fā)生變的時候保持穩(wěn)定、實現(xiàn)可復用
要點總結
Strategy及其子類為組件提供了一系列可重用的算法创夜,從而使得類型在運行時方便的根據(jù)需要在各個算法之間進行切換杭跪。
策略模式提供了用條件判斷語句以外的另一種選擇,消除條件判斷語句驰吓,就是在解耦合涧尿。含有許多條件判斷語句的代碼通常都需要Strategy模式。
如果Strategy對象沒有實例變量檬贰,那么各個上下文可以共享同一個Strategy對象姑廉,從而節(jié)省對象開銷。