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

来源:互联网 发布:信息记录软件 编辑:程序博客网 时间:2024/05/20 14:25

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

 

职责链:

 

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

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

 

策略: 

 

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

 

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

 

 

首先也是定义一个抽象的基类, 包含所有支持的算法的共有接口

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

对于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


 

 

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

原创粉丝点击