现在的位置: 首页 > 综合 > 正文

策略模式—计算消费金额

2014年03月05日 ⁄ 综合 ⁄ 共 1899字 ⁄ 字号 评论关闭

       策略模式它定义了一个算法家族,分别封装起来,让他们可以互相替换,此模式让算法的变化不会影响大到使用算法的客户。减少了各种算法类与使用算法类之间的耦合。 

      画的类图是

       

       CashSuperBLL类:

       该类是策略模式中的抽象类,是对各种算法的抽象。

    ''' <summary>
    ''' 定义所有支持算法的公共接口
    ''' </summary>
    Public Class CashSuper


        ''' <summary>
        ''' 现金收取超类的抽象方法,收取现金,参数为消费时间。返回为迎收取的金额。
        ''' </summary>
        ''' <param name="studentOFF">学生下机时间</param>
        ''' <param name="studentON">学生上机时间</param>
        Public Overridable Function AcceptCash(ByVal studentOFF As DateTime, ByVal studentON As DateTime) As Double
        End Function

    End Class '

CashNormal:继承抽象类,实现具体的算法的类。

它继承抽象类,它与抽象类的关系是,我继承你的骨架,包括方法、方法参数和返回值类型。但是具体返回值是如何计算的,该类说了算。这样无论算法如何改变都不会对其他类造成影响。在具体的算法中,如果需要一些具体的数据可以定义带参数的构造函数实现,这样具体算法需要的要的数据就获得了。而且他不熟写在系统里的,是可以改变的。

    ''' <summary>
    ''' 一般计费规则。其中包括固定用户计费和临时用户计费。
    ''' </summary>
    Public Class CashNormal : Inherits CashSuper


        ''' <summary>
        ''' 每多长时间计费一次
        ''' </summary>
        Private increaseTime As Integer = 1
        ''' <summary>
        ''' 计费时不计入
        ''' </summary>
        Private prepareTime As Integer = 0
        ''' <summary>
        ''' 它与increaseTime共同构成单价。
        ''' </summary>
        Private price As Double = 1

        ''' <summary>
        ''' 现金收取超类的抽象方法,收取现金,参数为消费时间。返回为应收取的金额。
        ''' </summary>
        ''' <param name="studentOFF">学生下机时间</param>
        ''' <param name="studentON">学生上机时间</param>
        Public Overrides Function AcceptCash(ByVal studentOFF As DateTime, ByVal studentON As DateTime) As Double
            Dim consumeTime As Integer
            Dim consumeCash As Double

            '消费金额计算
            consumeTime = CInt(DateDiff("n", studentOFF, studentON)) - prepareTime
                consumeCash = Val((price / increaseTime)) * Val(consumeTime)
                Return consumeCash

        End Function

        ''' <summary>
        ''' 带参数的构造函数
        ''' </summary>
        ''' <param name="price">它与increaseTime构成单价,每increaseTime分钟price元。</param>
        ''' <param name="increaseTime">递增时间:表示每多长时间计费一次。</param>
        ''' <param name="prepareTime">准备时间,计算消费金额的时候,不算在其中。</param>
        Public Sub New(ByVal price As Double, ByVal increaseTime As Integer, ByVal prepareTime As Integer)
            Me.price = price
            Me.increaseTime = increaseTime
            Me.prepareTime = prepareTime
        End Sub


    End Class 

         现在越来越觉得设计模式,就是解耦合,将不变的公共的部分抽离,上升高度。让具体的细节到子类中去实现。实现了代码的复用、易扩展和易维护。

         策略模式是行为类型的实际模式。行为类型模式使用继承描述算法和控制流,而行为型对象模式则描述一组对象怎样协作完成单个对象所无法完成的任务。
      

抱歉!评论已关闭.