【机房重构】下机——职责链模式+策略模式(实践篇)

前言

    上篇文章中,我们知道了如何使用职责链模式和策略模式去计算消费金额,关于其中可能涉及的一些的问题,我们也进行了一些简单的介绍。下面我们主要看如何用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

扫描二维码关注公众号,回复: 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 '计算消费金额


小结

       只要思路理清楚了,代码相对容易就可以写出,所以说,敲代码前的准备工作一定要做好~~~

猜你喜欢

转载自blog.csdn.net/ljl55555/article/details/72123982