及房重构利用策略模式+简单工厂实现消费金额的计算

在做第一次机房收费系统中,有一项很令人头疼的事情,那就是临时用户的问题,在结账的时候,我们需要考虑该用户是固定用户还是临时用户,原来在用VB6.0做的时候,如果我们实现了这个功能,那么在代码中会出现很多的IF....else 语句,同时,我们必须要调用数据设定窗体中的数据,这样的话,会很麻烦,写出来的代码也会很乱,如今学习了设计模式,我们可以利用策略模式来实现对不同用户的消费金额进行计算。将不同的类型用户所用到的不同算法封装到子类中去,同时与简单工厂结合起来,来实现对不同子类的实例化。这样在很大程度上实现了解耦,同时减少了我们U层代码的压力。

具体实现如下:

策略模式中的context类,在这个类中要声明我们所需要赋值和使用的参数,同时定义一个简单工厂的函数来实现对不同子类的实例化。

Public Class CountContext
    Dim cs As CountSuper '声明一个CountSuper对象
    '声明必要的参数属性

    '消费时间属性
    Private Allconsume_time As Decimal
    Public Property Allconsumetime As Decimal
        Set(value As Decimal)
            Allconsume_time = value
        End Set
        Get
            Return Allconsume_time
        End Get
    End Property

    ''' <summary>
    ''' 固定用户一小时费用
    ''' </summary>
    ''' <remarks></remarks>
    Private fixUser_CashOne As Decimal

    Public Property fixUserCashOne As Decimal
        Set(value As Decimal)
            fixUser_CashOne = value
        End Set
        Get
            Return fixUser_CashOne
        End Get
    End Property

    ''' <summary>
    ''' 临时用户半小时费用
    ''' </summary>
    ''' <remarks></remarks>
    Private tempUser_CashHalf As Decimal
    Public Property tempUserCashHalf As Decimal
        Set(value As Decimal)
            tempUser_CashHalf = value
        End Set
        Get
            Return tempUser_CashHalf
        End Get
    End Property

    ''' <summary>
    ''' 总共消费金额
    ''' </summary>
    ''' <remarks></remarks>
    Private allCash_Count As Decimal
    Public Property allCashCount As Decimal
        Set(value As Decimal)
            allCash_Count = value
        End Set
        Get
            Return allCash_Count
        End Get
    End Property
    Public Sub CountContext(ByVal type As String)
        Select Case type
            Case "固定用户"
                Dim cs0 = New FixUserCashCount()
                cs = cs0
                Exit Select
            Case "临时用户"
                Dim cs1 = New tempUserCashCount()
                cs = cs1
                Exit Select
        End Select
    End Sub
    '声明方法来让具体子类对象去执行具体的函数
    Public Sub CountAllCash()  '供客户端调用的方法
        cs.CashCount(Me) '返回消费总金额
    End Sub
End Class

策略模式中的抽象类:抽象类实现了对不同子类的封装,是子类继承父类,实现多态。在这里抽象类中定义一个提供计算消费金额的抽象一个方法。

Public MustInherit Class CountSuper
    ''' <summary>
    ''' 此为策略模式中用到的计算金额的抽象类
    ''' </summary>
    ''' <param name="count">countContext对象</param>
    ''' <remarks></remarks>
    Public MustOverride Sub CashCount(ByVal count As CountContext)

End Class

子类:Inherit CountSuper

固定用户子类

Public Class FixUserCashCount : Inherits CountSuper
    Public Overrides Sub CashCount(count As CountContext)
        '计算消费总金额
        count.allCashCount = -Int(-(count.Allconsumetime / 60)) * count.fixUserCashOne ’实现父类的方法
    End Sub
End Class

临时用户子类:

Public Class tempUserCashCount : Inherits CountSuper
    Public Overrides Sub CashCount(count As CountContext)
        count.allCashCount = -Int(-(count.Allconsumetime / 30)) * count.tempUserCashHalf
    End Sub
End Class

以上是在B层实现的各个方法,经过这些工作后,我们在U层只需要为context中需要的各个参数赋值后,直接调用其中的CountAllCash()方法即可。

原来做过通过状态模式计算学生的消费时间,这两个模式确实很像,它们从外表看类图是一

模一样的,只是状态模式在各个子类中要指明下一个执行的子类。二者本质上没有太大区别。

刚刚经过了设计模式的讨论会,我们知道策略模式是一种最基础的模式,它其中涉及到的关系很普遍,只包括了一个聚合和一个继承,而这两种关系也是我们设计模式中最常用的的,最核心的两种关系,通过原来的讨论我们发现很多的模式都可以通过转换而形成策略模式,所以掌握好策略模式对学习其他的设计模式还是很必要的。

及房重构利用策略模式+简单工厂实现消费金额的计算

时间: 2024-10-13 19:13:22

及房重构利用策略模式+简单工厂实现消费金额的计算的相关文章

“模”法无边—策略模式+简单工厂实现下机收费

下机收费是一种算法,临时用户和学生下机下机就是两种算法,让我想到了使用策略模式,根据是否为临时用户和学生,选择具体的算法,这属于简单工厂,好的,简单工厂+策略模式实现下机收费 策略类-封装具体的策略   '封装具体的算法,需要引用一个算法 Public Class consumeContext     Dim strategyconsume As Consume       Sub New(ByRef strategy As Consume)         Me.strategyconsume

策略模式+简单工厂模式+单例模式:简单推送服务

一.功能: 实现  获取数据  —>根据用户订阅清单进行推送 —> 这里的推送方式:QQ.Email.App.插件等等 用户可多选推送方式. 二.实现 1.推送方式—枚举(位运算): [Flags] public enum PushType { QQ = 0, Email = 2 } 2.策略模式:抽象推送策略 public interface IPush { bool Push(object data); } 3.QQ推送+Email推送 QQ推送:单例模式—静态创建QQ推送服务,线程安全.

C++利用反射和简单工厂模式实现业务模块解耦

1. 业务说明 为了便于说明,举一个简单的例子.假设现在有一个项目需要建立一个和银行交互的平台,目前只接入工商银行,后续接入其他银行,每个银行的业务都有差异,报文格式可能也不一致. 这里只列举几个简要的流程,仅包括拼报文,发送报文,接收报文,解析报文,其余整体架构以及后续处理等内容省略. 2. 初步设计 创建一个银行交互类 BankOpt,包括四个函数: int setMsg(); //拼报文 int sendMsg(); //发送报文 int getMsg(); //接收报文 int pars

再回首,策略、简单工厂是否依然?

?这篇博客是好久之前就打好的草稿,可是一直就拖到了现在,刚好在保定上课,笔记本也排不上大用场,翻看手机,终于捡起了这些草稿,决定写完. 再说设计模式之前,我们先说说开闭原则. 一.开闭原则(ocp) ?以前读这些官方解释,总是觉得很官方,现在在读,觉得句句经典.和大家共享 ?遵循开闭原则设计出的模块具有两个主要特点: ?(1)对于扩展是开放的(Open for extension).这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为.也就是说

工厂模式——简单工厂模式

工厂模式分三类:简单工厂模式.工厂方法模式.抽象工厂模式. 首先介绍比较简单一种工厂模式——简单工厂模式. 我们以计算器作为一个例子来说明工厂模式到底是什么.作为一个几年前大一从C语言起步的初级程序员,到现在写代码的思维还是停留在结构化编程,虽然Java学了有几年了,总是说面向对象面向对象.但是让实现一个计算器的程序,估计大部分人都会以C语言式的结构化编程来写,几个if语句或者一个switch来搞定.我也同样不例外,为了提高自己的编程水平,所以一点点开始学设计模式.其实在很多开源代码里也有很多经

【一起学设计模式】状态模式+装饰器模式+简单工厂模式实战:(一)提交个订单我到底经历了什么鬼?

前言 之前在我的博客(一枝花算不算浪漫)中已经更新过两篇设计模式相关的内容 [一起学设计模式]策略模式实战一:基于消息发送的策略模式实战 [一起学习设计模式]策略模式实战二:配合注解 干掉业务代码中冗余的if else... [一起学设计模式]访问者模式实战:权限管理树删节点操作 [一起学设计模式]命令模式+模板方法+工厂方法实战: 如何优雅的更新商品库存... 上面内容都是基于真实业务场景精简后的设计(工作中真实场景使用到的). 之前为了学习设计模式,看过网上很多相关博客讲解,大都是画下UML

策略模式和工厂模式的区别

工厂模式和策略模式看着很像,经常让人混淆不清; 它们的区别在哪里,需要细细体味: 相似点 在模式结构上,两者很相似: 差异 用途不一样 工厂是创建型模式,它的作用就是创建对象: 策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为; 关注点不一样 一个关注对象创建 一个关注行为的封装 解决不同的问题 工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例:它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关.主要应用在多数据库选择,类库文件加载

创建型模式 简单工厂模式

创建型模式 简单工厂模式 /** * 创建型模式 简单工厂模式 * 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. * * 1.工厂(Creator)角色 * 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类可以被外界直接调用,创建所需的产品对象. * 2.抽象(Product)角色 * 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口. * 3.具体产品(Concrete P

策略模式和工厂模式搭配使用

策略模式和工厂模式的搭配使用可以很好地消除代码if-else的多层嵌套 需求 针对店下商铺,有这样一个需求,对用户客户分为了普通客户.vip客户.超级vip用户.专属vip用户4个等级,每当用户购买商品时,针对不同的用户等级和消费金额采取不同的打折优惠策略.在平常的开发当中,必然会出现多层的if-else嵌套判断,先判断用户的等级再判断用户购买商品的消费金额. 弊端 以上的情况出现了多层的if-else嵌套,除此之外,以后如果需求再有变动,需要再增加一个用户等级,那么又会再次添加if-else的