机房重构利用策略模式+简单工厂实现消费金额的计算

在做第一次机房收费系统中。有一项非常令人头疼的事情,那就是暂时用户的问题,在结账的时候,我们需要考虑该用户是固定用户还是暂时用户,原来在用VB6.0做的时候,假设我们实现了这个功能,那么在代码中会出现非常多的IF....else 语句,同一时候。我们必需要调用数据设定窗口中的数据。这种话,会非常麻烦,写出来的代码也会非常乱,现在学习了设计模式。我们能够利用策略模式来实现对不同用户的消费金额进行计算。

将不同的类型用户所用到的不同算法封装到子类中去,同一时候与简单工厂结合起来,来实现对不同子类的实例化。这样在非常大程度上实现了解耦,同一时候降低了我们U层代码的压力。

详细实现例如以下:

策略模式中的context类,在这个类中要声明我们所须要赋值和使用的參数,同一时候定义一个简单工厂的函数来实现对不同子类的实例化。

Public Class CountContext
    Dim cs As CountSuper '声明一个CountSuper对象
    '声明必要的參数属性

    '消费时间属性
    Private Allconsume_time As Decimal
    Public Property Allconsumetime As Decimal
        Set(value As Decimal)
            Allconsume_time = value
        End Set
        Get
            Return Allconsume_time
        End Get
    End Property

    ''' <summary>
    ''' 固定用户一小时费用
    ''' </summary>
    ''' <remarks></remarks>
    Private fixUser_CashOne As Decimal

    Public Property fixUserCashOne As Decimal
        Set(value As Decimal)
            fixUser_CashOne = value
        End Set
        Get
            Return fixUser_CashOne
        End Get
    End Property

    ''' <summary>
    ''' 暂时用户半小时费用
    ''' </summary>
    ''' <remarks></remarks>
    Private tempUser_CashHalf As Decimal
    Public Property tempUserCashHalf As Decimal
        Set(value As Decimal)
            tempUser_CashHalf = value
        End Set
        Get
            Return tempUser_CashHalf
        End Get
    End Property

    ''' <summary>
    ''' 总共消费金额
    ''' </summary>
    ''' <remarks></remarks>
    Private allCash_Count As Decimal
    Public Property allCashCount As Decimal
        Set(value As Decimal)
            allCash_Count = value
        End Set
        Get
            Return allCash_Count
        End Get
    End Property
    Public Sub CountContext(ByVal type As String)
        Select Case type
            Case "固定用户"
                Dim cs0 = New FixUserCashCount()
                cs = cs0
                Exit Select
            Case "暂时用户"
                Dim cs1 = New tempUserCashCount()
                cs = cs1
                Exit Select
        End Select
    End Sub
    '声明方法来让详细子类对象去运行详细的函数
    Public Sub CountAllCash()  '供client调用的方法
        cs.CashCount(Me) '返回消费总金额
    End Sub
End Class
策略模式中的抽象类:抽象类实现了对不同子类的封装,是子类继承父类。实现多态。

在这里抽象类中定义一个提供计算消费金额的抽象一个方法。

Public MustInherit Class CountSuper
    ''' <summary>
    ''' 此为策略模式中用到的计算金额的抽象类
    ''' </summary>
    ''' <param name="count">countContext对象</param>
    ''' <remarks></remarks>
    Public MustOverride Sub CashCount(ByVal count As CountContext)

End Class
子类:Inherit CountSuper

固定用户子类

Public Class FixUserCashCount : Inherits CountSuper
    Public Overrides Sub CashCount(count As CountContext)
        '计算消费总金额
        count.allCashCount = -Int(-(count.Allconsumetime / 60)) * count.fixUserCashOne ’实现父类的方法
    End Sub
End Class

暂时用户子类:

Public Class tempUserCashCount : Inherits CountSuper
    Public Overrides Sub CashCount(count As CountContext)
        count.allCashCount = -Int(-(count.Allconsumetime / 30)) * count.tempUserCashHalf
    End Sub
End Class

以上是在B层实现的各个方法,经过这些工作后。我们在U层仅仅须要为context中须要的各个參数赋值后。直接调用当中的CountAllCash()方法就可以。

原来做过通过状态模式计算学生的消费时间。这两个模式确实非常像。它们从外表看类图是一

模一样的,仅仅是状态模式在各个子类中要指明下一个运行的子类。二者本质上没有太大差别。

刚刚经过了设计模式的讨论会,我们知道策略模式是一种最基础的模式,它当中涉及到的关系非常普遍,仅仅包含了一个聚合和一个继承,而这两种关系也是我们设计模式中最经常使用的的,最核心的两种关系,通过原来的讨论我们发现非常多的模式都能够通过转换而形成策略模式,所以掌握好策略模式对学习其它的设计模式还是非常必要的。

posted @ 2017-06-14 13:46  yfceshi  阅读(233)  评论(0编辑  收藏  举报