前言
上篇文章中,我们知道了如何使用职责链模式和策略模式去计算消费金额,关于其中可能涉及的一些的问题,我们也进行了一些简单的介绍。下面我们主要看如何用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 Function
B层:抽象基类
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
抽象基类
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 '计算消费金额
小结
只要思路理清楚了,代码相对容易就可以写出,所以说,敲代码前的准备工作一定要做好~~~