標籤:設計模式 策略模式 職責鏈模式
</pre><p><span style="font-size: 24px;">這兩個模式在進行個人重構的時候也使用了,當時是懵懵懂懂的,現在合作中又使用了一遍,思路清晰了很多,感覺這些設計模式之間有千絲萬縷的聯絡,功夫還不到家還得慢慢的理一理,記得有個師哥說過“到最後會發現設計模式其實就一個”,所以努力吧!先看看這兩個模式的應用。</span></p><p><span style="font-size: 24px;">職責鏈:確定消費時間</span></p><p><span style="font-size:24px">策略:計算不同類型卡的消費金額</span></p><p><span style="font-size:24px"> </span></p><p><span style="font-size:24px">職責鏈模式</span></p><p></p><p><span style="font-size:24px">職責鏈模式的好處比較直接的就是可以避免使用複雜的if語句,解耦了要求者和處理者,而且可以靈活的增加處理者,不會違背開放封閉原則。</span></p><p style="text-align:center"><img src="http://img.blog.csdn.net/20150429191705374" alt="" /></p><p><span style="font-size:24.44444465637207px">職責鏈模式的使用,是通過其中的OnLineCount來進行的,然後由調用其中的countTime()方法即可。</span></p><p><span style="font-size:24px"></span></p><pre name="code" class="csharp">public class OnlineTimeCountBLL {/// <summary>/// 計算消費時間/// </summary>/// <param name="enLine"></param>/// <param name="enBasicData"></param>public int CostTime(LineModel enLine, BasicDataModel enBasicData){ //在實體裡用的是decimal類型,但是在類裡用的是int類型進行計算所以使用(int) PrepareTimeHandlerBLL prepareTime = new PrepareTimeHandlerBLL((int)(enBasicData.prepareTime)); //執行個體化準備時間的類,同時用基本資料裡的準備時間對其進行初始化 UnitTimeHandlerBLL unitTime = new UnitTimeHandlerBLL((int)(enBasicData.unitTime)); //執行個體化單位時間的類,同時用基本資料裡的單位時間對其進行初始化 LeastTimeHandlerBLL leasetTime = new LeastTimeHandlerBLL((int)(enBasicData.limTime)); //執行個體化最少上機時間的類,同時用基本資料裡的最少上機時間對其進行初始化 //設定準備時間的後繼者,如果準備時間處理不了,則用最少上機時間進行處理 prepareTime.SetCalculate(leasetTime); //設定最少時間的後繼者,如果最少時間處理不了,則用單位上機時間進行處理 leasetTime.SetCalculate(unitTime); //調用準備時間的的方法開始進行處理 return prepareTime.HandleTime((int)enLine.consumeTime);}}
通過時序圖來整理一下邏輯
策略模式
策略模式是包含了不同的計算方法適用於不同的情況,使用者可以不關心具體調用那個演算法,可以通過其中的CountContext來確定。可以靈活的增加計算方法。
策略模式的使用是通過CountContext來進行的,通過CountContext()方法來確定執行個體化那個子類,然後在CountAllCash中調用執行個體化的子類的方法。
public class CountContextBLL { public CountSuperBLL m_CountSuperBLL; public CountContextBLL(string strCardType) { BasicDataBLL BasicDataBLL = new BasicDataBLL(); List<BasicDataModel> myList = new List<BasicDataModel>(); myList = BasicDataBLL.GetData(); foreach (BasicDataModel BasicData in myList) { decimal decFix = BasicData.rate;//得到固定使用者的收費標準 decimal decTemp = BasicData.temporaryRate;//臨時使用者的收費標準 switch (strCardType) { case "固定使用者"://如果是固定使用者就執行個體化固定使用者消費金額的計算 m_CountSuperBLL = new FixUserCashCountBLL(decFix);//初始化 break; case "臨時使用者"://如果是臨時使用者就執行個體化固定使用者消費金額的計算 m_CountSuperBLL = new tempUserCashCountBLL(decTemp);//初始化 break; default : break; } } } /// <summary> /// 供用戶端調用的方法 /// </summary> //上機時間作為參數,進行調用 public decimal CountAllCash(int onlineTime) { return m_CountSuperBLL.CashCount(onlineTime); //實際調用的是在CountContext中的執行個體化的子類的方法 } }
總結
用完這兩個模式有一種感覺,模式就是把我們本來寫在一個類中的方法分別的寫到子類中,在使用的時候根據不同的情況來執行個體化子類然後調用其中的方法。使得用戶端調用時不用知道B層的方法具體是幹什麼的,避免了在使用時使用過多的if語句進行判斷,一定程度上實現了U層和B層解耦。
物件導向的認識知識開了個頭,歡迎大家多多指教!
機房合作——職責鏈+策略模式