• 职责链模式+策略模式+反射,完美实现下机操作(一)


    版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/u010028869/article/details/37038209

    纵观机房收费系统。逻辑最复杂的也就是下机操作了。这几天一直在考虑下机操作该怎样进行。

    流程分析:

    推断卡号是否存在与是否上机上机时间的处理依据时间计算消费金额更新剩余金额,加入记录

     关于逻辑的操作主要集中在两个计算上面时间和金额。首先说上机时间的处理问题,做之前我看了下第一版机房收费系统关于下机的操作:

     

               '计算消费时间
    
                TxtTime.Text =DateDiff("n", Trim(TxtOntime.Text), Trim(Offtime))
    
                TxtTime.Text = TxtTime.Text -preparetime
    
                If TxtTime.Text < 0 Then
    
                    TxtTime.Text = 0
    
                    TxtMoney.Text = 0
    
                Else
    
                     '计算消费金额
    
                        If Trim(TxtType.Text) ="固定用户" Then
    
                            TxtMoney.Text =Int(TxtTime.Text / 30) * Val(Trim(rate))
    
                            IfVal(((Val(TxtTime.Text) Mod 30) + 30) * 60) > Val(Trim(unittime)) Then
    
                                TxtMoney.Text =Val(Trim(TxtTime.Text)) + Val(Trim(rate))
    
                            End If
    
                           '---------------------推断上机时间是否大与30分钟,小于30分钟按30分钟收费
    
                            If Val(TxtTime.Text)< 30 Then
    
                                TxtMoney.Text =rate
    
                            End If
    
                        Else
    
                            TxtMoney.Text =Int(TxtTime.Text / 60) * Val(Trim(tmprate))
    
                            IfVal((Val(TxtTime.Text) Mod 60) * 60) > Val(Trim(unittime)) Then
    
                                TxtMoney.Text =Val(Trim(TxtMoney.Text)) + Val(Trim(tmprate))
    
                            End If
    
                           '---------------------推断上机时间是否大与60分钟,小于60分钟按60分钟收费
    
                            If Val(TxtTime.Text)< 60 Then
    
                                TxtMoney.Text =tmprate
    
                            End If
    
                        End If
    
                End If
    
                mrcLine.Close
    


    真是慘不忍睹。时间处理不完好,一长串的if...else...语句。耦合过高,应对变化能力基本没有,别提维护和扩展性问题了。。

    经过查阅资料和分析,决定对于上机时间处理这块採用职责链模式,由于上机的时间依据大小分为三阶段,准备时间、至少上机时间、单位递增时间。在推断处理的时候是依次进行的,这就与职责链模式(“加薪”模式)不谋而合了,參照加薪模式把三阶段写成三个类,准备时间类,至少时间类和单位时间类。

    传入上下机的时间,假设小于准备时间。则准备时间类进行处理,否则传入下一阶段。假设小于至少上机时间则,至少时间类进行处理,否则继续传;一直到能够处理为止。

    消除了大量的选择推断语句,这也正是职责链的职责所在。

     

     UML图

        

    相关代码(这些类都建在B层)

    BL_COR_TimeHandler  抽象类。定义一个处理请求的接口

     

    PublicMustInherit Class BL_COR_TimeHandler
    
        Protected successor As BL_COR_TimeHandler
    
     
    
        PublicSub setsuccessor(ByVal successor As BL_COR_TimeHandler)                '设置继承者者
    
            Me.successor = successor
    
        End Sub
    
     
    
        Public MustOverride FunctionHandleTime(ByVal time As Integer) As Integer    '处理请求的抽象方法
    
    EndClass
    
    BL_COR_PrepareTimeHandler继承类BL_COR_TimeHandler,准备时间处理类

     

    PublicClass BL_COR_PrepareTimeHandler : Inherits BL_COR_TimeHandler
    
     
    
        Dim preparetime As Integer
    
        Public Sub New(ByVal ENBasicData As List(OfEN_BaseData_info))         '构造函数,传入准备时间的值 
    
            Me.preparetime =CInt(ENBasicData(0).preTime)
    
        End Sub
    
        Public Overrides Function HandleTime(timeAs Integer) As Integer
    
            If time <= preparetime Then                  '假设上机时间小于准备时间。返回0 
    
                Return 0
    
            Else
    
                Returnsuccessor.HandleTime(time)       '否则转到下一位继承者 
    
            End If
    
        End Function
    
    EndClass
    BL_COR_LeastTimeHandler,至少时间处理类
    PublicClass BL_COR_LeastTimeHandler : Inherits BL_COR_TimeHandler
    
        Private leasttime As Integer
    
        Public Sub New(ByVal ENBasicData As List(OfEN_BaseData_info))         '构造函数。传入至少上机时间的值 
    
            Me.leasttime =CInt(ENBasicData(0).leastTime)
    
        End Sub
    
        Public Overrides Function HandleTime(timeAs Integer) As Integer
    
           If time <= leasttime Then                  '假设上机时间小于至少上机时间,返回时间
    
                Return leasttime
    
            Else
    
                Returnsuccessor.HandleTime(time)        '否则转到下一位继承者 
    
            End If
    
        End Function
    
    EndClass
    BL_COR_UnitTimeHandler 单位时间处理类
    PublicClass BL_COR_UnitTimeHandler : Inherits BL_COR_TimeHandler
    
     
    
        Private unittime As Integer
    
        Public Sub New(ByVal ENBasicData As List(OfEN_BaseData_info))         '构造函数,传入递增时间时间的值 
    
            Me.unittime =CInt(ENBasicData(0).unitTime)
    
        End Sub
    
        Public Overrides Function HandleTime(timeAs Integer) As Integer       '大于至少时间,返回实际消费时间 
    
            Return Math.Abs(Int(-time / unittime))* unittime
    
        End Function
    
    EndClass
    到这职责链模式基本上就完毕了。当然为了便于调用还能够加入一个类,相似外观的接口,调用的时候仅仅须要传入两个实体參数就能够了。

    PublicClass BL_COR_OnlineTimeCount
    
        ''' <summary>
    
        ''' 职责链处理,上机时间的计算
    
        ''' </summary>
    
        ''' <paramname="ENBaseDatainfo">EN_BaseData_info基本数据实体</param>
    
        ''' <paramname="ENLineinfo">EN_Line_info上机记录实体</param>
    
        ''' <returns>处理后的上机时间</returns>
    
        ''' <remarks>牛迁迁2014年7月2日</remarks>
    
        Public Function CostTime(ByValENBaseDatainfo As List(Of EN_BaseData_info), ENLineinfo As EN_Line_info) AsInteger
    
            '实例化类,通过构造函数,传递參数
    
            Dim bPrepareTime As NewBL_COR_PrepareTimeHandler(ENBaseDatainfo)
    
            Dim bLeastTime As NewBL_COR_LeastTimeHandler(ENBaseDatainfo)
    
            Dim bStepTime As NewBL_COR_UnitTimeHandler(ENBaseDatainfo)
    
     
    
           bPrepareTime.setsuccessor(bLeastTime)                 '设置职责链继承者
    
            bLeastTime.setsuccessor(bStepTime)
    
     
    
            Dim time As Integer                          '计算上下机时间差
    
            time = DateDiff("n",ENLineinfo.onTime, ENLineinfo.offTime) + DateDiff("n",ENLineinfo.onDate, ENLineinfo.offDate)
    
     
    
            ReturnbPrepareTime.HandleTime(time)          '职责链处理。返回上机时间
    
        End Function
    
    EndClass

     

    调用以及传入參数
    '调用查询基本数据函数。返回实体集合
    
            basedatalist =queryBasedata.queryBaseData(ENBaseDatainfo)
    
            '调用职责链模式。计算上机的时间
    
            ENLineinfo.consumeTime =onTimeCount.CostTime(basedatalist, ENLineinfo)

    应用职责链模式,使系统在应对变化上迈出了一步。假设机房要加入一个满3小时赠1小时活动的话,仅仅须要加入一个对应的时间处理类就可以。非常好的符合了开闭原则。

    时间的处理就介绍到这。下篇博客会介绍怎样依据时间自己主动计算出消费的金额(策略模式+反射的应用)。

    未完待续。。。

     

  • 相关阅读:
    互动教程,让你5分钟掌握 Flexbox 布局模式
    Fixed Responsive Nav – 响应式的单页网站导航插件
    创意无限!一组网页边栏过渡动画【附源码下载】
    12款界面精美的 HTML5 & CSS3 网站模板
    Twproject Gantt – 开源的 JavaScript 甘特图组件
    真是好东西!一组动感的页面加载动画效果
    Method Draw – 很好用的 SVG 在线编辑器
    CSS Vocabulary – CSS 词汇表,你都掌握了吗?
    前端精选文摘:BFC 神奇背后的原理
    Vis.js – 基于浏览器的动态 JavaScript 可视化库
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10727528.html
Copyright © 2020-2023  润新知