现在的位置: 首页 > 综合 > 正文

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

2013年09月17日 ⁄ 综合 ⁄ 共 8942字 ⁄ 字号 评论关闭

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

 

职责链:

 

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

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

 

策略: 

 

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

 

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

 

 

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

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

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

 

 

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

抱歉!评论已关闭.