前言
上篇文章中,我们知道了如何使用职责链模式和策略模式去计算消费金额,关于其中可能涉及的一些的问题,我们也进行了一些简单的介绍。下面我们主要看如何用vb.net去实现之前的理论。
代码
职责链模式
Facade层
'消费时间计算 Public Function costTime(ByVal BasicdataInfo As List(Of Entity.BasicDataEntity), Lineinfo As Entity.MainEntity) As Integer '实例化,通过构造函数,传递参数 Dim bPrepareTime As New BLL.MainBLL.PrepareTimeHandler(BasicdataInfo) Dim bLeastTime As New BLL.MainBLL.BLeastTimeHandler(BasicdataInfo) Dim bAddTime As New BLL.MainBLL.UnitTimeHandler bPrepareTime.setsuccessor(bLeastTime) '设置下一个继承者 bLeastTime.setsuccessor(bAddTime) Dim time As Integer '计算在线时间 time = DateDiff("n", Lineinfo.ontime, Lineinfo.offtime) Return bPrepareTime.handleTime(time) End FunctionB层:抽象基类
Public MustInherit Class TimeHandler Protected successor As TimeHandler Public Sub setsuccessor(ByVal successor As TimeHandler) '设置继承类 Me.successor = successor End Sub Public MustOverride Function handleTime(ByVal time As Integer) As Integer '处理请求的抽象方法 End Class子类
''' <summary> ''' 准备时间处理 ''' </summary> ''' <remarks></remarks> Public Class PrepareTimeHandler : Inherits TimeHandler Dim preparetime As Integer Public Sub New(ByVal BasicDataInfo As List(Of Entity.BasicDataEntity)) '构造函数,传入准备时间值 Me.preparetime = CInt(BasicDataInfo(0).PrepareTime) End Sub Public Overrides Function handleTime(time As Integer) As Integer If time <= preparetime Then '如果上机时间小于准备时间,返回0 Return 0 Else Return successor.handleTime(time) '否则转到下一位继承者 End If End Function End Class ''' <summary> ''' 至少上机时间处理 ''' </summary> ''' <remarks></remarks> Public Class BLeastTimeHandler : Inherits TimeHandler Private leasttime As Integer Public Sub New(ByVal BasicdataInfo As List(Of Entity.BasicDataEntity)) Me.leasttime = CInt(BasicdataInfo(0).LeastTime) '将基础数据赋给leasttime这个变量 End Sub Public Overrides Function handleTime(time As Integer) As Integer If time <= leasttime Then '如果上机时间小于至少上机时间,返回至少上机时间 Return leasttime Else Return successor.handleTime(time) End If End Function End Class ''' <summary> ''' 消费时间计算 ''' </summary> ''' <remarks></remarks> Public Class UnitTimeHandler : Inherits TimeHandler Public Overrides Function handleTime(time As Integer) As Integer Return time End Function End Class
扫描二维码关注公众号,回复:
1018305 查看本文章
抽象基类
Public MustInherit Class CashSuper 'MustInherit指明该基类不能创建对象 '类中含有MustOveride时,此类必须由MustInherit进行声明。即:只能在属性和过程声明语句中使用 MustOverride。 '指定 MustOverride 的属性或过程必须是类的成员,并且该类必须标记为 MustInherit。 Public MustOverride Function GetConsumeMoney(ByVal BasicDataList As List(Of Entity.BasicDataEntity), ByVal OffInfo As Entity.MainEntity ) As Single End Class抽象策略
Public Class CashContext Dim cashsuper As CashSuper '根据收费策略的不同,获得计算结果 Public Function GetResult(ByVal BasicDataList As List(Of Entity.BasicDataEntity), ByVal OffInfo As Entity.MainEntity) As Single Select Case OffInfo.Type.Trim() Case "固定用户" cashsuper = New FixUser() '实例化具体策略 Case "临时用户" cashsuper = New TmpUser() Case Else cashsuper = Nothing End Select Return cashsuper.GetConsumeMoney(BasicDataList, OffInfo) End Function End Class具体策略
Public Class TmpUser : Inherits CashSuper '临时用户 Dim strTmpRate As Single Public Overrides Function GetConsumeMoney(ByVal BasicDataList As List(Of Entity.BasicDataEntity), ByVal OffInfo As Entity.MainEntity ) As Single strTmpRate = Trim(Int(BasicDataList(0).TmpRate)) Dim consumeCash As Single consumeCash = Trim(Val(strTmpRate * Val(OffInfo.ConsumeTime * 1.0 / 60.0))) If consumeCash < Int(BasicDataList(0).TmpRate) Then consumeCash = Int(BasicDataList(0).TmpRate) End If Return consumeCash End Function End Class
Public Class FixUser : Inherits CashSuper '固定用户 Dim strFixRate As Single Public Overrides Function GetConsumeMoney(ByVal BasicDataList As List(Of Entity.BasicDataEntity), ByVal OffInfo As Entity.MainEntity ) As Single strFixRate = Trim(Int(BasicDataList(0).Rate)) Dim consumeCash As Single consumeCash = Trim(Val(strFixRate * Val(OffInfo.ConsumeTime / 60.0))) If consumeCash < Trim(Int(BasicDataList(0).Rate)) Then consumeCash = Trim(Int(BasicDataList(0).Rate)) End If Return consumeCash End Function End Class
UI层
'获得卡号相应的上机信息 OfflineList = FacadeLineRecord.selectLineRecord(offInfo) offInfo.ontime = OfflineList(0).ontime offInfo.offtime = TimeOfDay offInfo.Type = OfflineList(0).Type Dim BasicdataList As List(Of Entity.BasicDataEntity) '基本数据设定相关 Dim FacadeBasicdata As New Facade.BasicDataFacade Dim BasicdataInfo As New Entity.BasicDataEntity Dim FacadeStrategy As New Facade.CashContext '策略模式 BasicdataList = FacadeBasicdata.GetData(BasicdataInfo) ' 得到基本数据设定表 offInfo.ConsumeTime = FacadeLineRecord.costTime(BasicdataList, offInfo) '使用职责链模式,将相关参数传入 offInfo.Consume = FacadeStrategy.GetResult(BasicdataList, offInfo) '使用策略模式,将相关参数传入 offInfo.Cash = (CDec(OfflineList(0).Cash) - CDec(offInfo.Consume)).ToString '计算消费金额
小结
只要思路理清楚了,代码相对容易就可以写出,所以说,敲代码前的准备工作一定要做好~~~