合作開發中負責商務邏輯成.所以就有一些的演算法和模式,下面就說下下機的基本操作.用到的有職責鏈和策略兩種設計模式
職責鏈:
是使多個對象都有機會處理請求。從而避免請求的寄件者和接收者之間的耦合關係。
將這個對象連成一條鏈。沿著鏈傳遞該請求。直到有一個對象處理為止。
策略:
定義了一組演算法。 讓它們之間可以相互提哈追。此模式讓演算法的變化,不會影響到使用演算法的客戶。
策略模式這裡用到的是固定使用者和臨時使用者的不同的收費情況
首先也是定義一個抽象的基類, 包含所有支援的演算法的共有介面
子類具體化策略類,封裝了演算法的行為,繼承於基類
對於CashContext是對抽象類別的引用, 並獲得它們具體的消費
下面看具體執行個體
抽象類別:
包含了抽象的演算法,讓子類去實現演算法
'''<summary> ''' 結賬類,處理上機消費問題,抽象類別 ''' </summary> PublicMustInheritClassCashierBLL ''' <summary> ''' 根據上機時間、卡的類型,計算消費金額,(抽象方法) ''' </summary> ''' <param name="onlineTime">上機時間,時間單位為分鐘</param> ''' PublicMustOverrideFunction GetConsumeMoney(ByVal onlineTime AsInteger)AsSingleEndClass'
固定使用者類:
包含有構造方法,初始化固定使用者的基本費用
'''<summary> '''固定使用者消費金額處理 '''</summary> PublicClassRegularBLL Inherits Charge.ChargeBLL.CashierBLL Private moneyRegularHourAsSingle'定義固定使用者每小時費用 '''<summary> '''根據上機時間,計算固定使用者此次上機消費金額 '''</summary> '''<param name="onlineTime">上機時間,時間單位為分鐘</param> PublicOverridesFunction GetConsumeMoney(ByVal onlineTimeAsInteger)AsSingle Dim consumeAsSingle'定義消費金額 '計算消費金額 consume =CSng(onlineTime) *CSng(moneyRegularHour / 60) Return consume EndFunction '''<summary> '''構造方法初始化固定使用者費用 '''</summary> PublicSubNew(moneyRegularHourAsSingle) Me.moneyRegularHour = moneyRegularHour EndSub EndClass' RegularBLL
臨時使用者類:
'''<summary> '''臨時使用者消費金額處理 '''</summary> PublicClassTemporaryBLL Inherits Charge.ChargeBLL.CashierBLL Private moneyTemporaryHalfHourAsSingle'臨時使用者半小時費用 '''<summary> '''根據上機時間,計算臨時使用者消費金額 '''</summary> '''<param name="onlineTime">上機時間,時間單位為分鐘</param> PublicOverridesFunction GetConsumeMoney(ByVal onlineTimeAsInteger)AsSingle Dim consumeAsSingle'定義消費金額 '計算消費金額 consume =CSng(onlineTime) *CSng(moneyTemporaryHalfHour / 30) Return consume EndFunction '''<summary> '''構造方法 '''</summary> PublicSubNew(moneyTemporaryHalfHourAsSingle) Me.moneyTemporaryHalfHour = moneyTemporaryHalfHour EndSub EndClass' TemporaryBLL
Context類的引用
對抽象類別的引用
'''<summary> '''消費金額配置類 '''</summary> PublicClassCashContextBLL '''<summary> '''消費金額處理 '''</summary> Private cashierAsCashierBLL Public m_CashierAsCashierBLL '''<summary> '''根據具體的Cashier對象,調用其計算消費金額的演算法的方法 '''</summary> '''<param name="onlineTime">上機時間,時間單位為分鐘</param> PublicFunction GetResult(ByVal onlineTimeAsInteger)AsSingle '調用消費處理類計算收費方法 Return cashier.GetConsumeMoney(onlineTime) EndFunction '''<summary> '''接受卡類型的構造方法 '''</summary> '''<param name="cardType">卡類型,固定使用者或臨時使用者</param> PublicSubNew(ByVal cardType AsString) Dim basicBLLAsNewBasicDataManagerBLL'定義查詢基本操作類 Dim basicEntityAsNewBasicDataEntity basicEntity = basicBLL.GetBasicData()'擷取基本資料資料 'select語句進行判斷選擇傳入的卡類型, '進行自動的建立消費類型 SelectCase cardType Case"固定使用者" cashier =NewRegularBLL(basicEntity.MoneyForRegularPerHour)'建立固定使用者收費類型 Case"臨時使用者" cashier =NewTemporaryBLL(basicEntity.MoneyForTemporaryHalfHour)'建立臨時使用者收費類型 Case Else cardType =Nothing EndSelect EndSub EndClass' CashContextBLL
最後用戶端只要調用Context就可以知道具體的消費情況啦,達到了很好的解耦效果
職責鏈模式
在這裡用到的是對時間的判斷
對於上機的學生,需要 有準備時間,最少上機時間,以及遞增事件。
當在準備時間內是不收費,當在最少時間內時是按最少時間收費的。 當大於最少時間則按遞增時間收費
職責鏈首先是定義一個基類,保證只有一個處理的請求介面
然後子類是具體的處理者類,處理它所負責的請求,可以訪問它的後續者,如何可以處理該請求,就處理,否則就將該請求轉寄給後續的繼承者。
基類中包含了具虛的繼承者以及虛的處理方法。為了是讓子類重新定義該演算法。
下面看具體的執行個體
基類(抽象類別)
'''<summary> '''上機時間處理類,處理上機時間用來計算上機消費 '''</summary> PublicMustInheritClassOnlineTimeHandlerBLL '''<summary> '''上機時間處理 '''</summary> Protected calculateAsOnlineTimeHandlerBLL ''' '''<param name="onlinetime">上機時間,以分鐘為單位</param> PublicMustOverrideFunction Request(ByVal onlinetimeAsInteger)AsInteger '''<summary> '''設定calculate的繼任者 '''</summary> '''<param name="calculate">上機時間處理</param> PublicOverridableSub SetCalculate(ByVal calculateAsOnlineTimeHandlerBLL) EndSubEndClass' OnlineTimeHandlerBLL
下面分別是繼承者,處理者類
準備時間處理者:
有構造方法,初始化私人準備時間
'''<summary> '''上機準備時間處理 '''</summary> PublicClassPreparedTimeHandlerBLL Inherits Charge.ChargeBLL.OnlineTimeHandlerBLL '''<summary> '''準備時間 '''</summary> Private preparedtimeAsLong ''' '''<param name="onlinetime">上機時間,以分鐘為單位</param> PublicOverridesFunction Request(ByVal onlinetimeAsInteger)AsInteger 'if函數判斷上機的時間是否在本處理範圍內,不在轉到下一個處理類,在返回0 If onlinetime <= preparedtimeThen Return 0'返回0 Else ReturnMe.calculate.Request(onlinetime) EndIf EndFunction '''<summary> '''設定calculate的繼任者 '''</summary> '''<param name="calculate">上機時間處理</param> PublicOverridesSub SetCalculate(ByVal calculateAsOnlineTimeHandlerBLL) Me.calculate = calculate'設定calculate的繼任者 EndSub '''<summary> '''初始化成員變數的構造方法 '''</summary> '''<param name="preparedtime">準備時間</param> PublicSubNew(ByVal preparedtime AsLong) Me.preparedtime = preparedtime'建構函式給私人時間 變數賦值 EndSub EndClass' PreparedTimeHandlerBLL
最少時間處理者:
也是有構造方法,初始化私人的最少時間
'''<summary> '''最少上機時間處理 '''</summary> PublicClassOnlineTimeLeastHandlerBLL Inherits Charge.ChargeBLL.OnlineTimeHandlerBLL '''<summary> '''最少上機時間 '''</summary> Private onlinetimeleastAsLong '''<summary> '''上機時間,以分鐘為單位 '''</summary> '''<param name="onlinetime"></param> '''<returns></returns> '''<remarks></remarks> PublicOverridesFunction Request(ByVal onlinetimeAsInteger)AsInteger 'if語句判斷上機時間是否在最少時間內,若在則返回onlinetimeleast, 否則轉到下一位處理 If onlinetime < onlinetimeleastThen ReturnCInt(onlinetimeleast)'小於最少時間,返回最少上機時間 Else '大於最少時間,轉到下一位處理 ReturnMe.calculate.Request(onlinetime) EndIf EndFunction '''<summary> '''設定calculate的繼任者 '''</summary> '''<param name="calculate">上機時間處理</param> PublicOverridesSub SetCalculate(ByVal calculateAsOnlineTimeHandlerBLL) Me.calculate = calculate'設定繼承者 EndSub '''<summary> '''初始化最少上機時間構造方法 '''</summary> '''<param name="onlinetimeleast">最少上機時間</param> PublicSubNew(ByVal onlinetimeleast AsLong) Me.onlinetimeleast = onlinetimeleast'初始化最少上機時間 EndSub EndClass' OnlineTimeLeastHandlerBLL
最後是遞增時間處理者類:
'''<summary> '''上機時間增長處理 '''</summary> PublicClassTimeIncreaseHandlerBLL Inherits Charge.ChargeBLL.OnlineTimeHandlerBLL '''<summary> '''上機增長時間 '''</summary> Private timeincreaseAsLong '''<summary> '''初始化上機增長時間的構造方法 '''</summary> '''<param name="timeincrease">上機增長時間</param> PublicSubNew(ByVal timeincrease AsLong) Me.timeincrease = timeincrease'初始化上機遞增時間 EndSub ''' '''<param name="onlinetime">上機時間,以分鐘為單位</param> PublicOverridesFunction Request(ByVal onlinetimeAsInteger)AsInteger Return onlinetime'返回上機時間 EndFunction '''<summary> '''設定calculate的繼任者 '''</summary> '''<param name="calculate">上機時間處理</param> PublicOverridesSub SetCalculate(ByVal calculateAsOnlineTimeHandlerBLL) Me.calculate = calculate'設定繼承者 EndSub EndClass' TimeIncreaseHandlerBLL
最後在調用之間設定好繼承者的順序,以及調用的初始總者
'調用基本資料查詢方法
basicEntity = basicdatamanagerbll.GetBasicData()
'建立準備時間,並付給準備時間
Dim prepareTimeAsNewPreparedTimeHandlerBLL(basicEntity.TimePrepared)
Dim listTimeAsNewOnlineTimeLeastHandlerBLL(basicEntity.TimeOnlineLeast)
'建立遞增時間,並付給遞增時間
Dim increaseTimeAsNewTimeIncreaseHandlerBLL(basicEntity.TimeIncrease)
'設定繼承者
prepareTime.SetCalculate(listTime)'設定後繼承者
listTime.SetCalculate(increaseTime)'設定後繼承者
'prepareTime.Request()
onLineRecord.GetonTime =CDate(dtCard.Rows(0).Item("LoginTime").ToString)'擷取消費時間
最後我們看下具體的
下機的方法
'''<summary> '''學生下機方法,通過某一卡號使某一學生下機,comment為正常下機還是強制下機 '''</summary> '''<param name="comment">是強制下機還是正常下機</param> '''<param name="card">儲值卡資訊</param> PublicFunction Logout(ByVal commentAsString,ByVal cardAsCardEntity)AsBoolean Dim dtCardAsNewDataTable Dim onIsFoundAsBoolean Dim cardIsFoundAsBoolean Dim basicEntityAsNewBasicDataEntity'定義基本資料實體類 Dim onLineRecordAsNewOnlineRecordEntity(NewStudentEntity(NewCardEntity)) Dim costTimeAsInteger Dim consumeAsSingle Dim balanceAsSingle Dim outIsFoundAsBoolean cardIsFound = cardmanagerbll.Validate(card)'調用查詢卡號是否存在方法 'if語句判斷卡號是否存在,true存在,false不存在 If cardIsFound =FalseThen '卡號不存在提示 ThrowNewException("此卡未註冊,請重新輸入卡號") Exit Function EndIf onIsFound = IsOnline(card)'調用查詢是否線上方法 'if語句判斷該卡是否線上 If onIsFound =FalseThen '該卡不線上,提示異常 ThrowNewException("該卡不線上,不能再次下機") Exit Function EndIf dtCard = onlinerecordManagerbll.QueryOnlineInfo(card)'根據卡號查詢正在上機學生資訊 '調用基本資料查詢方法 basicEntity = basicdatamanagerbll.GetBasicData() '建立準備時間,並付給準備時間 Dim prepareTimeAsNewPreparedTimeHandlerBLL(basicEntity.TimePrepared) Dim listTimeAsNewOnlineTimeLeastHandlerBLL(basicEntity.TimeOnlineLeast) '建立遞增時間,並付給遞增時間 Dim increaseTimeAsNewTimeIncreaseHandlerBLL(basicEntity.TimeIncrease) '設定繼承者 prepareTime.SetCalculate(listTime)'設定後繼承者 listTime.SetCalculate(increaseTime)'設定後繼承者 'prepareTime.Request() onLineRecord.GetonTime =CDate(dtCard.Rows(0).Item("LoginTime").ToString)'擷取消費時間 onLineRecord.GetDownTime =CDate(TimeOfDay.ToString) costTime =CInt(DateDiff("n", Format(onLineRecord.GetonTime,"HH:mm:ss"), TimeOfDay))'轉換擷取消費時間 '調用初始接收者 costTime = prepareTime.Request(costTime) card.CardType = dtCard.Rows(0).Item(9).ToString '傳入卡的類型 '調用策略模式的對象,傳入使用者類型 Dim conteshAsCashContextBLL =NewCashContextBLL(card.CardType) '調用策略模式的收費金額演算法'插入的參數為職責鏈的傳回值 consume = contesh.GetResult(costTime) balance =CSng(dtCard.Rows(0).Item("Balance").ToString) -CSng(consume)'計算餘額 card.Balance = balance'更新喻額 cardmanagerbll.Recharge(consume, card)'調用儲值的方法更新喻額 '實體賦值 onLineRecord.Comment = comment'強制下機或正常下機 onLineRecord.GetDownDate = Now onLineRecord.GetDownTime = Now onLineRecord.IsOnline = Trim("否") onLineRecord.IsCheckout ="否"'是否結賬 onLineRecord.ConsumeMoney = consume'消費金額 onLineRecord.Student.Card.CardNumber = card.CardNumber'下機卡號 '調用下機記錄更新方法,if語句判斷下機是否成功,true 成功,false不成功過 outIsFound = onlinerecordManagerbll.GetDownRegist(card, onLineRecord) If outIsFound =TrueThen ReturnTrue Else ReturnFalse 'Throw New Exception("下機失敗,請聯絡管理員") EndIf EndFunction
到此基本的順序就完結了,歡迎指正.