策略模式——计算下机费用

时间:2021-10-25 21:57:06

             上次写了一个博客,使用职责链模式解决了下机时消费时间的计算问题,这次聊聊如何解决计算费用的问题。要解决这个问题就可以使用策略模式。

定义

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


      自己的理解:拿上机来说,因为用户的分类不同,所以计算的结果也是不同的,固定用户费率比一般用户要低,所以将固定用户和临时用户的计算过程分别封装在两个不同的类,在客户端根据用户类型来判断实例化哪个类,这样将算法分离出去的好处,就是易于扩展,如果我们要加一种优惠方式,比如有不同的几种会员卡:银卡,金卡,钻卡,增加再多也不用担心,因为只需要在扩展出来存放这些算法的类就可以解决问题了。


UML结构图

策略模式——计算下机费用

机房中的UML图

策略模式——计算下机费用

优点

  • 简化单元测试,每个算法都有自己的类,可以通过自己的接口单独测试
  • 易于算法扩展
  • 有效避免多重条件选择语句

缺点

  • 会添加很多策略类和策略对象
  • 必须了解每个策略类的特点
(其实上述的两个缺点也不算是很大的缺点)


机房代码(都写在了B层)

CashContext
Public Class BC_CashContext
Dim cashsuper As BC_CashSuper '定义抽象类
Public Sub New(ByVal cardType As String)
Select Case cardType
Case "固定用户"
cashsuper = New BC_CashVip() '创建固定用户收费类型
Case "一般用户"
cashsuper = New BC_CashNormal() '临时用户收费
Case Else
cardType = Nothing
End Select

'Dim strInstance As String = "BLL.BC-Cash" + cardType '反射不成功
'cashsuper = CType(Assembly.Load("BLL").CreateInstance(strInstance), BC_CashSuper)

End Sub

Public Function GetResult(ByVal Time As Integer) As Single
'调用相关的消费处理类计算收费方法
Return cashsuper.GetConsumeMoney(Time)
End Function
End Class

CashSuper

Public MustInherit Class BC_CashSuper
Public MustOverride Function GetConsumeMoney(ByVal Time As Integer) As Single

End Class

CashVip
Public Class BC_CashVip : Inherits BC_CashSuper
Dim basicBll As New BLL.UserBLL '用于查询基础数据
Dim Enbasicinfo As New Entity.BasicData '定义实体
Dim basicList As List(Of Entity.BasicData) '定义实体泛型
Dim VipCash As Single '定义变量存放会员用户每小时费用

Public Overrides Function GetConsumeMoney(Time As Integer) As Single
'调用查询方法获取数据,且赋值给实体泛型集合
basicList = basicBll.getBasicList()
VipCash = basicList(0).Vipcost '给变量赋值(会员用户每小时费用)
Dim consumeCash As Single
consumeCash = CSng(Time) * CSng(VipCash / 60) '计算消费金额
Return consumeCash
End Function
End Class

CashNormal

<span style="font-size:14px;">Public Class BC_CashNormal : Inherits BC_CashSuper
Dim basicBll As New BLL.UserBLL
Dim enBasicinfo As New Entity.BasicData
Dim basicList As List(Of Entity.BasicData)
Dim NorCash As Single

Public Overrides Function GetConsumeMoney(Time As Integer) As Single
basicList = basicBll.getBasicList

NorCash = basicList(0).Commoncost
Dim consumecash As Single
consumecash = CSng(Time) * CSng(NorCash / 60)
Return consumecash
End Function
End Class</span>
 

UI

Dim enlineinfo As New Entity.LineRecordEntity
enlineinfo.ConsumeTime = consumetime.ToString
Dim consumecash As Single = cashcontext.GetResult(enlineinfo.ConsumeTime) '计算消费的金额,将消费时间传入


总结

       第一次用策略模式还有些许不熟练的地方,在合作中还有用到,希望可以深入了解,熟练掌握,第一次还想用反射,但是没有成功,希望可以和小伙伴们解决这个问题。