策略模式:定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的客户。从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法之间的耦合。
策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
在机房重构中可以运用这种方法和职责链模式的结合共同解决下机问题。下机时的根据不同的使用者(临时用户和固定用户),因为这两个用户单位时间花费的钱数不同,所以要用不同的方法。在这里运用策略模式,可以简单的对不同用户进行结账。
策略的抽象类:定义所有支持的算法的公共接口。
''' <summary>
''' 结账类,处理下机时不同用户类型的抽象类
''' </summary>
''' <remarks></remarks>
Public MustInherit Class CashBll
Public MustOverride Function GetConsumeMoney(ByVal onlineTime As Integer) As Single
End Class
具体的策略类:封装了具体的算法或行为,继承于CashBll。
''' <summary>
''' 固定用户消费处理
''' </summary>
''' <remarks></remarks>
Public Class RegularBll
Inherits Charge.Bll.CashBll
Private moneyRegularHour As Single '每小时固定用户的费用
Public Overrides Function GetConsumeMoney(onlineTime As Integer) As Single
Dim consume As Single '定义消费金额
consume = CSng(onlineTime) * CSng(moneyRegularHour / 60)
Return consume
End Function
''' <summary>
''' 构造方法初始化固定用户费用
''' </summary>
''' <param name="moneyRegularHour"></param>
''' <remarks></remarks>
Public Sub New(moneyRegularHour As Single)
Me.moneyRegularHour = moneyRegularHour
End Sub
End Class
''' <summary>
''' 临时用户消费
''' </summary>
''' <remarks></remarks>
Public Class TemporaryBll
Inherits Charge.Bll.CashBll
Private moneyTemporaryHalfHour As Single '临时用户半小时费用
Public Overrides Function GetConsumeMoney(onlineTime As Integer) As Single
Dim consume As Single
consume = CSng(onlineTime) * CSng(moneyTemporaryHalfHour / 30)
Return consume
End Function
Public Sub New(moneyTemporaryHalfHour As Single)
Me.moneyTemporaryHalfHour = moneyTemporaryHalfHour
End Sub
End Class
CashContextBLL类:维护对CashBLL的引用
Public Class CashContextBll
Private cashier As Bll.CashBll
''' <summary>
''' 根据具体的Cashbll对象,调用其计算消费金额的算法
''' </summary>
''' <param name="onlineTime">上机时间,时间单位为分钟</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function GetResult(ByVal onlineTime As Integer) As Single
Return cashier.GetConsumeMoney(onlineTime) '调用消费处理类计算收费方法
End Function
''' <summary>
''' 接受卡类型的构造方法
''' </summary>
''' <param name="cardType"></param>
''' <remarks></remarks>
Public Sub New(ByVal cardType As String)
Dim basicBll As New Bll.BasicDataBll
Dim basicEntity As IList(Of Entity.BasicDataEntity)
basicEntity = basicBll.ReadData '获取基本数据的信息数据
'select语句进行判断选择传入卡的类型,进行自动创建消费类型
Select Case cardType
Case "固定"
cashier = New Bll.RegularBll(basicEntity(0).Fixeduser)
Case "临时"
cashier = New Bll.TemporaryBll(basicEntity(0).Temuser)
Case Else
cardType = Nothing
End Select
End Sub
End Class
下机处理: 在UI下机事件中调用策略模式
Dim data As New Bll.OnlineBll
Dim Wlist As List(Of Entity.OnLineEntity)
Dim Wstu As New Entity.OnLineEntity
Wstu.Cardno = txtCardno.Text
Wstu.Status = "正常上机"
Wlist = data.CheckID(Wstu)
'调用策略模式的收费金额算法
'插入的参数为职责链的返回值
Dim context As Bll.CashContextBll = New Bll.CashContextBll(Wlist(0).cardtype)
Dim consume As Single
consume = context.GetResult(costTime)
这样就可以算出用户所消费的金额。