用户调用机房收费下机中用到的策略与职责链解析

题记:写这篇博客要主是加深自己对用户调用的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。

     合作开发中责负业务逻辑成.所以就有一些的算法和模式,上面就说下下机的基本操作.用到的有责职链和策略两种设计模式

     

    

责职链:

    是使多个对象都有会机处置求请。从而免避求请的发送者和接收者之间的耦合关系。

    将这个对象连成一条链。沿着链传递该求请。直到有一个对象处置为止。

     

    

策略:

    定义了一组算法。 让它们之间可以互相提哈追。此模式让算法的化变,不会影响到用使算法的客户。

     

    策略模式这里用到的是牢固用户和时临用户的不同的收费情况

     

    用户和调用

     

    首先也是定义一个抽象的类基, 包括全部支撑的算法的共有口接

    类子详细化策略类,封装了算法的行为,承继于类基

    对于CashContext是对抽象类的引用, 并得获它们详细的花费

     

    上面看详细实例

     

    

抽象类:

    包括了抽象的算法,让类子去实现算法

'''<summary>

   ''' 结账类,处置上机花费题问,抽象类

  ''' </summary>

   PublicMustInheritClassCashierBLL

       ''' <summary>

       ''' 根据上机间时、卡的型类,算计花费金额,(抽象方法)

       ''' </summary>

       ''' <param name="onlineTime">上机间时,间时单位为分钟</param>

       '''

       PublicMustOverrideFunction GetConsumeMoney(ByVal onlineTime AsInteger)AsSingle

EndClass'

    
 

    

牢固用户类:

     包括有构造方法,初始化牢固用户的基本费用

'''<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)

       EndSub

EndClass' 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

    
 

    到此基本的次序就完结了,迎欢正指.

文章结束给大家分享下程序员的一些笑话语录: AdobeFlash拖垮Windows拖垮IE!又拖垮Linux拖垮Ubuntu拖垮FirxEox!还拖垮BSD拖垮MacOS拖垮Safri!简直无所不拖!AdobeFlash滚出网路世界!不要以为市占有率高就可以持续出烂货产品!以后替代品多得是!

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3067643.html