[設計模式] 策略模式(Strategy) + 簡單工廠(Simple Factory)

  • 5433
  • 0
  • 2010-03-02

[設計模式] 策略模式(Strategy) + 簡單工廠(Simple Factory)

Introduction

(原文出處 大話設計模式 )

策略模式 : 封裝了一些演算法,讓它們之間可以互相替換,並且讓演算法的變化降低對使用者的影響。

 

Example

今天我需要設計一個簡單的收銀程式,可是商場有時會有一些促銷活動,比方說打折(8折、7折..)、買300送100或是累積點數...等等,

如此,我的收銀系統,就必須依照當時商場的活動來調整我的計算方式。

 

UI 介面

2010-02-07_142300

 

是的利用簡單工廠也是可以達成,建立一個抽象類別(CashSuper),然後讓其他演算法類別(CashNormal、CashRebate、CashReturn)繼承,然後再建立打造

一個收費工廠類別(CashFactory)負責判斷與建立相對應的演算法物件。

 

若是今天我的促銷方式是打 7折,明天繼續下猛藥改打 6折,這樣我就必須建立許多「打折」類別,工廠也需要增加判斷式;

觀察一下演算法,打幾折只是形式的不同,所有打折的算法都是一樣,紅利也是如此。

使用策略模式,用戶端程式碼。

2010-02-07_150316

 

以上,在 Client 端使用 swith 判斷不是很好,故結合簡單工廠,來減輕 Client 的負擔。

 

CashSuper.cs

2010-02-07_150937

 

CashNormal.cs

2010-02-07_151106

 

CashRebate.cs

2010-02-07_151319

 

CashReturn.cs

2010-02-07_151456

 

CashContext.cs

2010-02-07_151638

 

用戶端表單程式(主要部分)

2010-02-07_151852

 

 

透過策略模式,可以減少各個演算法類別之間的藕合,並且析出共同的功能(GetResult),而且簡化了單元測試,

因為每個演算法都是一個獨立的類別。策略模式封裝了變化。

書上的建議,當需求為不同時間應用不同的業務規則,就可以考慮使用策略模式處理變化的可能性。

這邊值得注意的是,CashContext.cs 類別還是使用了條件判斷,雖然我們最大化的減輕用戶端的負擔,

不過還是付出了成本。

還有甚麼方法可以減低條件判斷的成本? 還是一樣 反射 技術。

三小俠  小弟獻醜,歡迎指教