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

本文通过实例介绍如何运用策略模式解决不同用户类型的计费问题,通过将各种计费算法封装为独立的类,实现算法之间的互换,便于扩展和维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

定义

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


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


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)  '计算消费的金额,将消费时间传入


总结

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


评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值