策略模式

    策略模式:定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的客户。从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法之间的耦合。

                      

      策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

      在机房重构中可以运用这种方法和职责链模式的结合共同解决下机问题。下机时的根据不同的使用者(临时用户和固定用户),因为这两个用户单位时间花费的钱数不同,所以要用不同的方法。在这里运用策略模式,可以简单的对不同用户进行结账。

      策略的抽象类:定义所有支持的算法的公共接口。

      

''' <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)
        这样就可以算出用户所消费的金额。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值