[設計模式] 策略模式(Strategy) + 簡單工廠(Simple Factory)
Introduction
(原文出處 大話設計模式 )
策略模式 : 封裝了一些演算法,讓它們之間可以互相替換,並且讓演算法的變化降低對使用者的影響。
Example
今天我需要設計一個簡單的收銀程式,可是商場有時會有一些促銷活動,比方說打折(8折、7折..)、買300送100或是累積點數...等等,
如此,我的收銀系統,就必須依照當時商場的活動來調整我的計算方式。
UI 介面
是的利用簡單工廠也是可以達成,建立一個抽象類別(CashSuper),然後讓其他演算法類別(CashNormal、CashRebate、CashReturn)繼承,然後再建立打造
一個收費工廠類別(CashFactory)負責判斷與建立相對應的演算法物件。
若是今天我的促銷方式是打 7折,明天繼續下猛藥改打 6折,這樣我就必須建立許多「打折」類別,工廠也需要增加判斷式;
觀察一下演算法,打幾折只是形式的不同,所有打折的算法都是一樣,紅利也是如此。
使用策略模式,用戶端程式碼。
以上,在 Client 端使用 swith 判斷不是很好,故結合簡單工廠,來減輕 Client 的負擔。
CashSuper.cs
CashNormal.cs
CashRebate.cs
CashReturn.cs
CashContext.cs
用戶端表單程式(主要部分)
透過策略模式,可以減少各個演算法類別之間的藕合,並且析出共同的功能(GetResult),而且簡化了單元測試,
因為每個演算法都是一個獨立的類別。策略模式封裝了變化。
書上的建議,當需求為不同時間應用不同的業務規則,就可以考慮使用策略模式處理變化的可能性。
這邊值得注意的是,CashContext.cs 類別還是使用了條件判斷,雖然我們最大化的減輕用戶端的負擔,
不過還是付出了成本。
還有甚麼方法可以減低條件判斷的成本? 還是一樣 反射 技術。
三小俠 小弟獻醜,歡迎指教