机房收费系统--下机消费金额计算问题

   在学习策略模式的时候,我曾写过一篇关于策略模式的博客,但是那个时候学得模模糊糊的,这次做机房收费系统,把策略模式融入到我的代码中,对策略模式进一步的了解了。在做下机结账的那一部分的时候,我考虑过职责链模式,状态模式和策略模式。

   职责链模式:还记得在大话设计模式中,对于指责链模式的描述是加薪非要老总批?其实现在想想,职责链最终解决越权的问题,当权利不够的时候,一层层往上报。在某个职责范围内干自己的活!

职责链模式(Chain of Responsibility)的官方定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

那么用图形表示这段让人费解的话就是:

机房收费系统--下机消费金额计算问题_第1张图片

状态模式:解决的主要问题是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的逻辑简单化。其实状态模式就是把复杂的IF语句或switch语句变成一个类中多个方法,一个语句块对应一个方法。在机房收费系统中,不单单是下机可以使用状态模式,在其他的很多逻辑判断负责的地方都已用到状态模式!

状态模式的官方定义为:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

那么用图形表示这段让人费解的话就是:

机房收费系统--下机消费金额计算问题_第2张图片

策略模式:把复杂的逻辑判断算法封装到一个类中,每个算法对应着一个方法。策略模式和状态模式不同之处就在于策略模式封装的是复杂的逻辑判断算法,而状态模式封装的是复杂的逻辑判断。

策略策略模式官方的定义为:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

那么用图形表示这段让人费解的话就是:

机房收费系统--下机消费金额计算问题_第3张图片x

计算下机消费金额,我把它分为三个部分,一个部分是在准备时间内,若上机时间不超过准备时间,则不收费。一部分是不超过最少上机时间,则上机消费时间=每个单位时间内消费金额。另一部分是超过了最少上机时间,上机消费金额=每个单位时间内消费金额*单位时间的个数。

考虑到上机消费金额它属于一个算法,虽然有些简单,犹如小学一年级的算术题,但是考虑到不让算法影响到使用的客户,最后还是决定用册里面模式,具体的代码实现:

        '调用策略模式
        Dim Result As Double
        Dim OffAccount As OffContext
        OffAccount = New OffContext(TotalExpendTime, EntityStudent.Studenttype)
        Result = OffAccount.GetResult(TotalExpendTime)


Public MustInherit Class CashSuper
    '定义所有支持的算法的公共接口
    Public MustOverride Function ExpendCash(ByVal time As Integer) As Double
End Class

Public Class FInLessTime : Inherits CashSuper
    Private Cardtype As String = ""

    '通过构造函数传递参数
    Public Sub New(ByVal Cardtype As String)
        Me.Cardtype = Cardtype
    End Sub
    ''' <summary>
    ''' 计算固定用户在最少上机时间内消费金额
    ''' </summary>
    ''' <param name="Time">上机消费时间</param>
    ''' <returns>固定用户每个单位时间内消费金额</returns>
    ''' <remarks></remarks>
    Public Overrides Function ExpendCash(ByVal Time As Integer) As Double
        Return MainBLL.GetBasicdata.Fixedcost
    End Function
End Class

Public Class FMoreLesstime : Inherits CashSuper

    Private Cardtype As String = "" '初始化Cardtype
    Private Time As Integer = 0D '初始化UseTime

    ''' <summary>
    ''' 通过构造函数传递参数
    ''' </summary>
    ''' <param name="Cardtype">卡类型,固定用户或临时用户</param>
    ''' <param name="Time">消费时间</param>
    Public Sub New(ByVal Cardtype As String, ByVal Time As String)
        Cardtype = Cardtype
        Time = Integer.Parse(Time)
    End Sub
    ''' <summary>
    ''' 固定用户消费金额
    ''' </summary>
    ''' <param name="time">消费时间</param>
    ''' <returns>消费总金额Result</returns>
    ''' <remarks></remarks>
    Public Overrides Function ExpendCash(ByVal time As Integer) As Double
        Dim Unittime As Integer '单位时间
        Dim Remainder As Integer '余数
        Dim Preparetime As Integer '准备时间
        Dim Inctime As Integer '递增时间
        Dim FiedCash As Double '临时用户单位时间消费金额

        Preparetime = MainBLL.GetBasicdata.Preparetime
        Inctime = MainBLL.GetBasicdata.Increasetime
        FiedCash = MainBLL.GetBasicdata.Fixedcost
        '计算有多少个单位时间
        Unittime = (time - Preparetime) / Inctime '
        '计算有多少个单位时间时的 余数
        Remainder = (time - Preparetime) Mod Inctime

        '判断余数是否大于0,如果余数大于0,则得数加1,如果余数等于0,则直接使用得数
        If Remainder <> 0 Then
            Unittime = Unittime + 1
        End If
        Dim Result As Double
        Result = FiedCash * Unittime '计算消费总金额
        Return Result
    End Function
End Class

Public Class LessPreparetime : Inherits CashSuper
    ''' <summary>
    ''' 在准备时间消费金额
    ''' </summary>
    ''' <param name="time">消费时间</param>
    ''' <returns>上机时间未超过准备时间,不收费0</returns>
    ''' <remarks></remarks>
    Public Overrides Function ExpendCash(ByVal time As Integer) As Double
        Return 0
    End Function
End Class

Public Class OffContext

    Private cs As CashSuper = Nothing
    ''' <summary>
    ''' 构造函数
    ''' </summary>
    ''' <param name="time">消费时间</param>
    ''' <param name="Cardtype">卡类型</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal time As Integer, ByVal Cardtype As String)

        Dim Lesstime As Integer   '定义最少上机时间
        Dim Preparetime As Integer  '定义准备时间
       
        Lesstime = MainBLL.GetBasicdata.Lesstime  '最少上机时间
        Preparetime = MainBLL.GetBasicdata.Preparetime  '准备时间

        '上机时间小于准备时间
        If time < Preparetime Then
            cs = New LessPreparetime()
            Exit Sub
        End If
        '临时用户上机时间小于最少上机时间
        If time < Lesstime And Trim(Cardtype) = "临时用户" Then
            cs = New TInLessTime(time)
            Exit Sub
        End If

        '固定用户上机时间未超过最少上机时间
        If time < Lesstime And Trim(Cardtype) = "固定用户" Then
            cs = New FInLessTime(time)
            Exit Sub
        End If

        '固定用户超过最少上机时间
        If time > Lesstime And Trim(Cardtype) = "固定用户" Then
            cs = New FMoreLesstime(Cardtype, time)
            Exit Sub
        End If

        '临时用户超过最少上机时间
        If time > Lesstime And Trim(Cardtype) = "临时用户" Then
            cs = New TMoreLesstime(Cardtype, time)
            Exit Sub
        End If

    End Sub
    ''' <summary>
    ''' 获取消费金额
    ''' </summary>
    ''' <param name="time">消费金额</param>

    Public Function GetResult(ByVal time As Integer)
        Return cs.ExpendCash(time)
    End Function
End Class

Public Class TInLessTime : Inherits CashSuper
    Private Cardtype As String = ""
    '通过构造函数传递参数
    Public Sub New(ByVal Cardtype As String)
        Me.Cardtype = Cardtype
    End Sub
    ''' <summary>
    ''' 计算临时用户在不超过最少消费金额时消费金额
    ''' </summary>
    ''' <param name="Inttime">时间</param>
    ''' <returns>临时用户每个单位时间消费金额</returns>
    ''' <remarks></remarks>
    Public Overrides Function ExpendCash(ByVal Inttime As Integer) As Double
        Return MainBLL.GetBasicdata.Casualexpendst
    End Function
End Class

Public Class TMoreLesstime : Inherits CashSuper

    Private Cardtype As String = "" '初始化Cardtype
    Private Time As Integer = 0D '初始化Time
    '通过构造函数传递参数
    Public Sub New(ByVal Cardtype As String, ByVal Time As String)
        Cardtype = Cardtype
        Time = Integer.Parse(Time)
    End Sub
    ''' <summary>
    ''' 固定用户消费金额
    ''' </summary>
    ''' <param name="time">消费时间</param>
    ''' <returns>消费金额Result</returns>
    ''' <remarks></remarks>
    Public Overrides Function ExpendCash(ByVal time As Integer) As Double
        Dim Unittime As Integer '单位时间
        Dim Remainder As Integer '余数
        Dim Preparetime As Integer '准备时间
        Dim Inctime As Integer '递增时间
        Dim Tempcost As Double '临时用户单位时间消费金额

        Preparetime = MainBLL.GetBasicdata.Preparetime
        Inctime = MainBLL.GetBasicdata.Increasetime
        Tempcost = MainBLL.GetBasicdata.Casualexpendst
        '计算有多少个单位时间
        Unittime = (time - Preparetime) / Inctime '
        '计算有多少个单位时间时的 余数
        Remainder = (time - Preparetime) Mod Tempcost

        '判断余数是否大于0,如果余数大于0,则得数加1,如果余数等于0,则直接使用得数
        If Remainder <> 0 Then
            Unittime = Unittime + 1
        End If

        Dim Result As Double
        Result = Tempcost * Unittime
        Return Result
    End Function


End Class
消费金额的计算虽然很简单,但是它也是一种算法,我通过消费时间和用户类型来计算上机的消费金额,分了五种计算方法,在不同的情况下直接调用符合要求的算法即可,所以最后我还是选择使用策略模式来完成我的下机消费金额操作.

你可能感兴趣的:(机房收费系统--下机消费金额计算问题)