机房收费下机中用到的策略与职责链解析
来源:互联网 发布:信息记录软件 编辑:程序博客网 时间: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
到此基本的顺序就完结了,欢迎指正.
- 机房收费下机中用到的策略与职责链解析
- 职责链模式——机房收费系统下机结账
- 【机房合作】策略+职责链在下机中的应用
- 【机房重构】--职责链模式+策略模式 实现下机
- 【机房重构个人版】上下机与职责链
- 个人机房重构——下机与职责链的结合
- 机房收费系统的上下机
- 机房收费系统的上下机
- 机房重构下机(职责链+策略+反射+存储过程)
- 机房重构——下机(职责链模式+策略模式)
- C#版机房合作——策略、职责链模式下机
- 【机房重构】下机——职责链模式+策略模式(理论篇)
- 【机房重构】下机——职责链模式+策略模式(实践篇)
- 机房收费之上下机
- 机房收费之上下机
- 【机房收费】上下机
- 机房收费之上下机
- 机房收费之上下机
- Google搜索原理
- Android:将activity设置为弹出式的并设置为透明的
- pg数据库备份恢复
- DataTable转换成List<T>
- [git] HOWTO work with git flow
- 机房收费下机中用到的策略与职责链解析
- adb shell 命令详解(转)
- HTML5之IndexedDB使用详解
- POJ 2771 Guardian of Decency(最大独立点集)
- Camera源码分析(android2.2)
- eclipse-cpp提示"launch failed.Binary not found"错误的解决方法
- python学习~元类
- Sybase You can't run SELECT INTO in this database. Please check with the Database Owner.
- 关闭某窗体