机房重构——上下机算法巧用抽象模式

前言:

    其实在敲机房收费系统的时候无论是手动下机,还是系统在自动下机,还是在选择全部和部分下机的时候都用到了计算上下机的时间算法,其实一提到算法,我们很自然的就想到了策略模式,但是在仔细分析了上下机算法的情况的之后,我觉得在这里用抽象工厂模式更加的适合。

内容:

     首先说一下我计算钱的一种方式,我的计算单位时间是30分钟,每隔一个单位时间固定用户就是2元,临时用户就是3元。在上机时间与单位时间之比如果有余数,那么就是上机时间除以单位时间加上1除以单位金额,否则的话就是上机时间除以单位时间乘以单位金额。简单说就是:

 用户=固定用户
上机时间mod单位时间>0 那么 (上机时间/单位时间+1)*单位金额
                                          否则(上机时间/单位时间)*单位金额
用户=临时用户
上机时间mod单位时间>0 那么 (上机时间/单位时间+1)*单位金额
                                          否则(上机时间/单位时间)*单位金额

反应到抽象工厂模式的uml图如下:


相关的代码如下:

#Region "计算算法-抽象工厂方法。"
'第一种算法,算法:时间/单位时间是整数是整数的,那么就让时间乘以价格

Public Interface Icalculateone
    Function calculateone(basicdatalist As List(Of Model.basicdata), consumetime As Integer)

End Interface
Public Class tempUCalculateone : Implements Icalculateone

    Public Function calculateone(basicdatalist As List(Of Model.basicdata), consumetime As Integer) As Object Implements Icalculateone.calculateone
        Dim temprate As Decimal = basicdatalist(0).TempRate
        Dim unittime As Integer = basicdatalist(0).Unittime
        Dim product As Decimal = temprate * consumetime / unittime
        Return product

    End Function
End Class
Public Class Ucalculatetone : Implements Icalculateone

    Public Function calculateone(basicdatalist As List(Of Model.basicdata), consumetime As Integer) As Object Implements Icalculateone.calculateone
        Dim rate As Decimal = basicdatalist(0).Rate
        Dim unittime As Integer = basicdatalist(0).Unittime
        Dim product As Decimal = rate * consumetime / unittime
        Return product
    End Function
End Class
'第二种算法,这种算法是余数部位0,那么让结果加1
Public Interface Icalculatetwo
    Function calculatetwo(basicdatalist As List(Of Model.basicdata), consumetime As Integer)
End Interface
'临时用户的第一种算法。
Public Class TempUcalculatetwo : Implements Icalculatetwo

    Public Function calculatetwo(basicdatalist As List(Of Model.basicdata), consumetime As Integer) As Object Implements Icalculatetwo.calculatetwo
        Dim tempRate As Decimal = basicdatalist(0).TempRate
        Dim unittime As Integer = basicdatalist(0).Unittime
        Dim product As Decimal = tempRate * (consumetime \ unittime + 1)
        Return product
    End Function
End Class
'固定用户的第一种算法。
Public Class Ucalculatetwo : Implements Icalculatetwo
    Public Function calculatetwo(basicdatalist As List(Of Model.basicdata), consumetime As Integer) As Object Implements Icalculatetwo.calculatetwo
        Dim Rate As Decimal = basicdatalist(0).Rate
        Dim unittime As Integer = basicdatalist(0).Unittime
        Dim product As Decimal = Rate * (consumetime \ unittime + 1)
        Return product
    End Function
End Class
'用户工厂
Public Interface Iuserfactory
    Function creatIcalculateone() As Icalculateone
    Function creatIcalculatetwo() As Icalculatetwo
End Interface
'临时用户工厂。
Public Class tempfacatory : Implements Iuserfactory
    Public Function creatIcalculateone() As Icalculateone Implements Iuserfactory.creatIcalculateone
        Return New tempUCalculateone()
    End Function

    Public Function creatIcalculatetwo() As Icalculatetwo Implements Iuserfactory.creatIcalculatetwo
        Return New TempUcalculatetwo()
    End Function
End Class
'固定用户工厂。
Public Class Ufacatory : Implements Iuserfactory
    Public Function creatIcalculateone() As Icalculateone Implements Iuserfactory.creatIcalculateone
        Return New Ucalculatetone()
    End Function

    Public Function creatIcalculatetwo() As Icalculatetwo Implements Iuserfactory.creatIcalculatetwo
        Return New Ucalculatetwo()
    End Function
End Class
#End Region


       遇到算法的时候我们理应想到的是策略模式,但是如果在根据具体的情况加以分析,可能会有更适合的模式。还有在外观层的时候我们可以写一个简单的的的switch case 语句进行简单的判断,然后再UI层调用即可,具体的代码就不呈现了,不影响大家的思路!

总结:

     从策略模式想到抽象工厂用的时间不长,但是如何策划类与类之间的关系,之间如何进行传参数,我用了很长的时间,看来对于设计模式而言,不仅仅是适用的场景,我们也要更加注重设计模式类之间的关系!


你可能感兴趣的:(机房重构——上下机算法巧用抽象模式)