上次写了一个博客,使用职责链模式解决了下机时消费时间的计算问题,这次聊聊如何解决计算费用的问题。要解决这个问题就可以使用策略模式。
定义
它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
自己的理解:拿上机来说,因为用户的分类不同,所以计算的结果也是不同的,固定用户费率比一般用户要低,所以将固定用户和临时用户的计算过程分别封装在两个不同的类,在客户端根据用户类型来判断实例化哪个类,这样将算法分离出去的好处,就是易于扩展,如果我们要加一种优惠方式,比如有不同的几种会员卡:银卡,金卡,钻卡,增加再多也不用担心,因为只需要在扩展出来存放这些算法的类就可以解决问题了。
UML结构图
机房中的UML图
优点
- 简化单元测试,每个算法都有自己的类,可以通过自己的接口单独测试
- 易于算法扩展
- 有效避免多重条件选择语句
缺点
- 会添加很多策略类和策略对象
- 必须了解每个策略类的特点
机房代码(都写在了B层)
CashContextPublic 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) '计算消费的金额,将消费时间传入