機房合作――職責鏈+策略模式
來源:程序員人生 發布時間:2015-06-12 08:21:43 閱讀次數:3565次
這兩個模式在進行個人重構的時候也使用了,當時是懵懵懂懂的,現在合作中又使用了1遍,思路清晰了很多,感覺這些設計模式之間有千絲萬縷的聯系,工夫還不到家還得漸漸的理1理,記得有個師哥說過“到最后會發現設計模式其實就1個”,所以努力吧!先看看這兩個模式的利用。
職責鏈:肯定消費時間
策略:計算不同類型卡的消費金額
職責鏈模式的好處比較直接的就是可以免使用復雜的if語句,解耦了要求者和處理者,而且可以靈活的增加處理者,不會背背開放封閉原則。職責鏈模式的使用,是通過其中的OnLineCount來進行的,然后由調用其中的countTime()方法便可。
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);
}
}
通過時序圖來整理1下邏輯
策略模式
策略模式是包括了不同的計算方法適用于不同的情況,使用者可以不關心具體調用那個算法,可以通過其中的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中的實例化的子類的方法
}
}
總結
用完這兩個模式有1種感覺,模式就是把我們本來寫在1個類中的方法分別的寫到子類中,在使用的時候根據不同的情況來實例化子類然后調用其中的方法。使得客戶端調用時不用知道B層的方法具體是干甚么的,避免了在使用時使用過量的if語句進行判斷,1定程度上實現了U層和B層解耦。
面向對象的認識知識開了個頭,歡迎大家多多指教!
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈