合作开发中负责业务逻辑成.所以就有一些的算法和模式,下面就说下下机的基本操作.用到的有职责链和策略两种设计模式
职责链:
是使多个对象都有机会处理请求。从而避免请求的发送者和接收者之间的耦合关系。
将这个对象连成一条链。沿着链传递该请求。直到有一个对象处理为止。
策略:
定义了一组算法。 让它们之间可以相互提哈追。此模式让算法的变化,不会影响到使用算法的客户。
策略模式这里用到的是固定用户和临时用户的不同的收费情况
首先也是定义一个抽象的基类, 包含所有支持的算法的共有接口
子类具体化策略类,封装了算法的行为,继承于基类
对于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
到此基本的顺序就完结了,欢迎指正.