前言:
其实在敲机房收费系统的时候无论是手动下机,还是系统在自动下机,还是在选择全部和部分下机的时候都用到了计算上下机的时间算法,其实一提到算法,我们很自然的就想到了策略模式,但是在仔细分析了上下机算法的情况的之后,我觉得在这里用抽象工厂模式更加的适合。
内容:
首先说一下我计算钱的一种方式,我的计算单位时间是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
总结:
从策略模式想到抽象工厂用的时间不长,但是如何策划类与类之间的关系,之间如何进行传参数,我用了很长的时间,看来对于设计模式而言,不仅仅是适用的场景,我们也要更加注重设计模式类之间的关系!