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

来源:互联网 发布:酷家乐衣柜设计软件 编辑:程序博客网 时间:2024/05/21 20:16

前言

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


小结

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

0 0
原创粉丝点击