zoukankan      html  css  js  c++  java
  • 机房重构利用策略模式+简单工厂实现消费金额的计算

    在做第一次机房收费系统中。有一项非常令人头疼的事情,那就是暂时用户的问题,在结账的时候,我们需要考虑该用户是固定用户还是暂时用户,原来在用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()方法就可以。

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

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

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

  • 相关阅读:
    IO流(5)—缓冲流
    vue-element-admin 中文问题
    npm 下载慢解决方案
    fatal: unable to connect to github.com
    为什么有sessionStorage,localStorage等,还需要vuex
    vuex页面刷新数据丢失的解决办法
    Node中JWT的使用
    socket.io 实现长连接演示代码
    WebSocket 实现长连接演示代码
    jquery ajax上传文件
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7008402.html
Copyright © 2011-2022 走看看