機房收費下機中用到的策略與職責鏈解析

來源:互聯網
上載者:User

 合作開發中負責商務邏輯成.所以就有一些的演算法和模式,下面就說下下機的基本操作.用到的有職責鏈和策略兩種設計模式

 

職責鏈:

 

是使多個對象都有機會處理請求。從而避免請求的寄件者和接收者之間的耦合關係。

將這個對象連成一條鏈。沿著鏈傳遞該請求。直到有一個對象處理為止。

 

策略: 

 

定義了一組演算法。 讓它們之間可以相互提哈追。此模式讓演算法的變化,不會影響到使用演算法的客戶。

 

策略模式這裡用到的是固定使用者和臨時使用者的不同的收費情況

 

 

首先也是定義一個抽象的基類, 包含所有支援的演算法的共有介面

子類具體化策略類,封裝了演算法的行為,繼承於基類

對於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

 

 

到此基本的順序就完結了,歡迎指正.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.