3.2 strategy (策略模式)
動機:在軟體構建過程中,某些物件使用的演算法可能多種多樣,經常改變,如果將這些演算法都編碼到物件中,將會使物件變得異常複雜,而且有時候支援不使用或不常使用的演算法也是乙個效能負擔。
如何在執行時根據需要透明地改變物件的演算法?將演算法和物件本身解耦,從而避免上述問題?
**示例:
如果使用第一種方法,需要更改列舉型別和if else語句(第6行和24行),違背了開放封閉原則(對擴充套件開發,對修改封閉);
採用第二種方法(策略模式),定義稅法基類,對不同國家稅法定義不同子類,override calculate方法。59行,多型呼叫。
假設出現變化:擴充套件32 - 39行,salesorder不變(復用性,遵循開放封閉原則)。
補:物件導向提到的復用性,指的是編譯單位(二進位制單位)的復用性,不是貼上**的復用性
1 // strategy1.cpp2 enum taxbase ;
8 9 class salesorder
18 else if (tax == us_tax)
21 else if (tax == de_tax)
24 else if (tax == fr_tax)
27 28 //....
29 }
30
1定義:定義一系列演算法, 把它們乙個個封裝起來,並且使它們可以互相替換(變化)。該模式使得演算法可獨立於使用它的客戶程式(穩定)而變化(擴充套件,子類化)。2 class taxstrategy
6 };
7 8
9 class cntax : public taxstrategy
14 };
15 16 class ustax : public taxstrategy
21 };
22 23 class detax : public taxstrategy
28 };
29 30
31 32 //擴充套件
33 //*********************************
34 class frtax : public taxstrategy
39 };
40 41
42 class salesorder
50 ~salesorder()
53 54 public double calculatetax()
62
63 };
類圖:
要點總結:
strategy及其子類為元件提供了一系列可重用的演算法,從而可以得到型別在執行時方便地根據需要在各個演算法之間進行切換。
strtegy模式提供了用條件判斷語句以外的另一種選擇消除條件判斷語句,就是在解耦合。含有許多條件判斷語句的**通常都需要strategy模式。(除非if else語句絕對不變,如對一周七天判斷等)
如果strategy物件沒有例項變數,那麼各個上下午可以共享同乙個strategy物件,從而節省物件開銷。
4 設計模式 策略模式 Strategy
enum taxbase class salesorder else if tax us tax else if tax de tax else if tax fr tax 當需要新增型別時taxbase.又需要加if else.違背開閉原則 對擴充套件開放,對更改關閉 將演算法提出抽象出來。建立對...
C 設計模式 Strategy策略模式
strategy策略模式 作用 定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。uml圖 strategy模式將邏輯 演算法 封裝到乙個類 context 裡面,通過組合的方式將具體演算法的實現在組合物件中實現,再通過委託的方式將抽象介面的實...
C 設計模式 Strategy策略模式
strategy策略模式 作用 定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。uml圖 strategy模式將邏輯 演算法 封裝到乙個類 context 裡面,通過組合的方式將具體演算法的實現在組合物件中實現,再通過委託的方式將抽象介面的實...