在上一篇博文結尾中,提到了存在的問題,那麼我們通過策略模式與簡單工廠結合的方式來解決上篇結尾中提到的問題。 方法很簡單,我們將CashContext簡單的改造一下即可 哈哈,是不是很像一個工廠? 那麼,客戶端調用起來就非常非常簡單了。 嗯,是不是很簡潔明瞭? 很多剛開始接觸設計模式的小伙伴有這樣一個 ...
在上一篇博文結尾中,提到了存在的問題,那麼我們通過策略模式與簡單工廠結合的方式來解決上篇結尾中提到的問題。
方法很簡單,我們將CashContext簡單的改造一下即可
1 class CashContext 2 { 3 CashSuper cs = null; 4 public CashContext(string type) 5 { 6 switch (type) 7 { 8 case "正常收費": 9 cs = new CashNormal(); 10 break; 11 case "滿300返100": 12 cs = new CashReturn("300", "100"); 13 break; 14 case "打8折": 15 cs = new CashRebate("0.8"); 16 break; 17 } 18 } 19 public double GetResult(double money) 20 { 21 return cs.acceptCash(money); 22 } 23 }
哈哈,是不是很像一個工廠?
那麼,客戶端調用起來就非常非常簡單了。
1 double total = 0.0d; 2 /// <summary> 3 /// 點擊確定按鈕 4 /// </summary> 5 /// <param name="sender"></param> 6 /// <param name="e"></param> 7 private void OK_Click(object sender, EventArgs e) 8 { 9 CashContext cc = new CashContext(cobEvent.SelectedItem.ToString()); 10 double totalPrices = 0d; 11 totalPrices = cc.GetResult(Convert.ToDouble(UnitPrice.Text) * Convert.ToDouble(Count.Text)); 12 total = total + totalPrices; 13 listTotal.Items.Add($"單價:{UnitPrice.Text} 數量:{Count.Text} 優惠方式:{cobEvent.SelectedItem} 合計:{totalPrices.ToString()}"); 14 }
嗯,是不是很簡潔明瞭?
很多剛開始接觸設計模式的小伙伴有這樣一個感覺:策略模式和簡單工廠模式沒啥區別啊,感覺都差不多啊。
嗯,一開始我也是這麼認為的。但,小伙伴們,睜大眼睛請看一下。
若 簡單工廠 模式,客戶端是這樣的:
1 CashSuper csuper=CashFactory.createCashAccept(cobEvent.SelectedItem.ToString()); 2 ......=csuper.GetResult(....);
若 策略模式 ,客戶端是這樣的:
1 CashContext csuper=new CashContext(cobEvent.SelectedItem.ToString()); 2 ......=csuper.GetResult(....);
看出啥區別來了嗎? 小伙伴們不禁要說了,這有啥區別,在我看來,這點區別沒啥用啊。
好,下麵我就點出區別的本質。
簡單工廠:客戶端需要認識兩個類,CashSuper和CashFactory。
策略模式:客戶端只需要認識一個類,CashContext就可以了。
綜上,策略模式耦合更加降低。這使得具體的收費演算法徹底的與客戶端分離,連演算法的父類 CashSuper都不用讓客戶端認識了。
OK,策略模式和簡單工廠的結合講完了,他倆的區別也給大家說了,那麼,很多很多的小伙伴不禁要說了:即便是用了簡單工廠+策略模式結合,都避免不了一個問題,那就是 如果商場需要增加一種新的演算法,就必須改CashContext中的switch代碼,這總讓人不爽啊。
任何需求的變更都是需要成本的,但是成本的高低還是有差異的。高手和菜鳥的區別就是,高手可以花同樣的代價獲得最大的收益,或者說,做同樣的事,花最小的代價。面對同樣的需求,當然是改動越小越好。
面對上述小伙伴們提出的問題,我們有一個很好的解決辦法,那就是反射技術,在此我們先不展開將了,我會在後面的博文中給大家講解。
好了,今天就到這吧,下一篇,會講 裝飾模式
本系列將持續更新,喜歡的小伙伴可以點一下關註和推薦,謝謝大家的支持。