根據不同國家的稅率進行不同演算法計算
enum taxbase
;class
salesorder
else
if(tax == us_tax)
else
if(tax == de_tax)
else
if(tax == fr_tax)
//....}}
;
考慮未來變化,當出現新的需求(新的國家增加),需要考慮實現enum增加新的稅法如法國,並在if else的控制語句下新增新的計算方法。
此種設計並不是正確,違背開閉原則,也不是**復用,應該應可能使用擴充套件的方式。
使用strategy設計模式重構**。
class
taxstrategy};
class
cntax
:public taxstrategy};
class
ustax
:public taxstrategy};
class
detax
:public taxstrategy};
//擴充套件
//*********************************
class
frtax
:public taxstrategy};
class
salesorder
~salesorder()
public
double
calculatetax()
};
taxstrategy是抽象基類,實現稅率計算的抽象介面,並同時具有虛析構函式。
由各國稅法繼承taxstrategy,並實現不同的稅率計算。新的需求出現時,可以直接將法國稅率類繼承taxstrategy,並實現法國的稅率計算功能。
salesorder類組合方式包含稅率基類指標,實際是多型指標,構造器借由工廠類實現產生不同的派生類指標去實現其獨有的稅率計算,工廠類返回的是堆物件,而不是棧物件,所以需要析構前delete。
context context();負責構建上下文環境。
未使用strategy設計模式的缺陷是,**得不到二進位制層面復用,通過更改原始碼來實現新增往往會打破前面的條件,產生問題。計算機在執行時,大量不被使用的**段被裝載,但實際使用的只是某種稅率計算。最好的執行模式是將**段裝載在cpu高階快取中,但if else或switch case的結構設計會導致**過多,實際真正執行**段可能放不進cpu高階快取中。
strategy設計模式可以解決這個效能問題,節省物件開銷,並利於功能擴充套件,符合開閉原則,對擴充套件開放,對更改封閉。
出自c++設計模式
Strategy 設計模式
strategy模式 來對輪胎的樣式進行不同的替換,可以替換成短輪胎痕跡的汽車輪胎,這樣在不更改car類的前題下進行了不同輪胎樣式的改變,輪胎和輪胎之間可以互相替換,這就是策略模式。public class car public void settyre inte ce ref luntai tyr...
設計模式 策略模式(Strategy)
策略模式 定義了演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化不會影響到使用演算法的使用者。封裝變化點是物件導向的一種很重要的思維方式 strategy類,定義所有支援的演算法的公共介面 抽象演算法類 abstract class strategy 演算法方法 public ...
設計模式 策略模式(strategy)
策略模式定義了一系列演算法,並將每個演算法封裝起來,使他們可以相互替換,且演算法的變化不會影響到使用演算法的客戶。需要設計乙個介面,為一系列實現類提供統一的方法,多個實現類實現該介面,設計乙個抽象類 可有可無,屬於輔助類 提供輔助函式 抽象折扣類 public inte ce memberstrat...