大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合。

UML 图:

根据《大话设计模式》——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式:

     /// <summary>
    /// 现金收费抽象类
    /// </summary>
    public abstract class CashSuper
    {
        /// <summary>
        /// 现金收取超类抽象方法收取现金
        /// </summary>
        /// <param name="money">原价</param>
        /// <returns>当前价格</returns>
        public abstract double acceptCash(double money);
    }

现金收费抽象类

     /// <summary>
    /// 正常收费子类
    /// </summary>
    public class CashNormal : CashSuper
    {
        public override double acceptCash(double money)
        {
            return money;
        }
    }

    /// <summary>
    /// 打折收费子类
    /// </summary>
    public class CashRebate : CashSuper
    {
        private double moneyRebate = 1d;        

        public CashRebate(string moneyRebate)
        {
            //打折收费,初始化时,必须需要输入折扣率,如八折就是 0.8
            this.moneyRebate = double.Parse(moneyRebate);
        }

        public override double acceptCash(double money)
        {
            return money * moneyRebate;
        }
    }

    /// <summary>
    /// 返利收费子类
    /// </summary>
    public class CashReturn : CashSuper
    {
        private double moneyCondition = 0.0d;
        private double moneyRetrun = 0.0d;

        public CashReturn(string moneyCondition,string moneyReturn)
        {
            //返利收费,初始化时候必须要输入返利条件和返利值,比如满
            //300返回100,则moneyCondition为300,moneyReturn为100
            this.moneyCondition = double.Parse(moneyCondition);
            this.moneyRetrun = double.Parse(moneyReturn);
        }

        public override double acceptCash(double money)
        {
            double result = money;
            if (money >=moneyCondition)
            {
                result = money - Math.Floor(money / moneyCondition) * moneyRetrun;
            }
            return result;
        }
    }

各种算法子类

    /// <summary>
    /// 上下文类
    /// </summary>
    public class CashContext
    {
        CashSuper cs = null;

        public CashContext(string type)
        {
            switch (type)
            {
                case "正常收费":
                    CashNormal cs0 = new CashNormal();
                    this.cs = cs0;
                    break;
                case "满300返100":
                    CashReturn cs1 = new CashReturn("300","100");
                    this.cs = cs1;
                    break;
                case "打8折":
                    CashRebate cs2 = new CashRebate("0.8");
                    this.cs = cs2;
                    break;

            }
        }

        public double GetResult(double money)
        {
            return cs.acceptCash(money);
        }
    }

上下文类

客户端代码:

 void btnOk_Click(object sender, EventArgs e)
 {
    CashContext csuper = new CashContext(this.cbxType.Text);
    double totalPrices = 0d;
    totalPrices = csuper.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
    total = total + totalPrices;
    lbxList.Items.Add("单价: " + txtPrice.Text + " 数量: " + txtNum.Text + " " + cbxType.Text + " 合计: " + totalPrices.ToString());
    this.lblTotal.Text = total.ToString();
 }

界面截图:

大话设计模式读书笔记2——策略模式

时间: 2024-12-26 18:14:52

大话设计模式读书笔记2——策略模式的相关文章

大话设计模式读书笔记--2.策略模式

面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类 定义 它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户 模式结构 Strategy: 定义所有支持算法的公共接口 ConcreteStrategy: 封装了具体的算法或行为,也就是具体的策略 Context:是算法对象工厂, 维护一个Strategy对象的引用, 产生具体算法对象 模式实现 场景:模拟商城收银软件,营业员根据客户所

head first 设计模式读书笔记 之 策略模式

作为一个php开发者,深知曾经很多程序员都鄙视php,为什么呢?因为他们认为php的语法是dirty的,并且由于开发者水平参差不齐导致php的代码更加乱上加乱,维护起来简直一坨shit一样.随着php加入了面向对象的阵型之后,很多开发者开始使用了oop思想来写代码,php也变得越来越标准,越来越规范.而其中,设计模式起到了不小的作用.最近老大找我谈话,说php这边的开发模块耦合度过高,代码感觉质量不高,想来一次代码重构行动.我对代码重构也是一知半解,而代码重构的基础就是去了解设计模式,于是我翻起

大话设计模式读书笔记--12.状态模式

定义 状态模式定义: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来改变了其类 消除庞大的条件分支,将特定状态的行为放入一个对象中 生活中:开灯和关灯是两个状态 模式结构 Context: 上下文环境,维护一个状态实例,定义当前的状态 State: 抽象状态类,定义一个接口,封装与Context的一个特定状态相关的行为 ConcreteState:具体状态.实现Context的一个特定状态相关的行为 代码实现 场景: 12店之前是休闲状态, 之后是忙碌状态 点击下载代码 特点及使用场

大话设计模式读书笔记--23.访问者模式

定义 访问者模式定义: 表示一个作用于某对象结构中的各元素的操作,它使你在不改变各元素的类的前提下,定义作用于这些元素的新操作 把数据结构, 和作用于数据结构上的操作,分离 模式结构 代码实现 场景: 男人和女人谈恋爱,男人的状态和女人的状态 代码实现:点击下载 特点和使用场景 优点:很容易增加新的操作 缺点: 使增加新的数据结构变得困难 使用场景: 数据结构相对稳定的系统

大话设计模式读书笔记--8.外观模式

外观模式的用意是为子系统提供一个集中化和简化的沟通渠道,而不是向子系统加入新的行为 生活中的例子: 一个电源总开关可以控制四盏灯.一个风扇.一台空调和一台电视机的启动和关闭.该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计 定义 定义: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这一接口使得这一子系统更加容易使用 结构图 Facade: 是模式的核心,指导所有子系统的功能, 可根据客户端的需求定制功能组合 SubSystemOne: 实现子系统

大话设计模式读书笔记--6.原型模式

简单的复制粘贴极有可能造成重复代码的灾难, 但是java中提供了克隆的功能, 如果一个对象创建过程复杂,又要频繁使用, 在初始化信息不发生变化的情况下,应当采取克隆而不是new一个对象 定义 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 也就是说, 只需知道原型对象的类型,就可以拷贝, 拷贝分为浅拷贝和深拷贝,可参考浅拷贝和深拷贝 模式结构 Prototype: 抽象原型类,声明克隆接口 ConcretePrototypeA: 具体的原型类, 实现克隆操作 模式实现

大话设计模式读书笔记--18.命令模式

定义 命令模式定义: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作 比如: 吃烤串时, 客人点烤羊肉,烤鸡肉, 服务员记录下客人的点餐记录,然后通知厨师开始做 烤羊肉,烤鸡肉是请求对象;服务员是命令请求者;厨师是命令实现者 命令模式将功能(请求)封装成对象 目的 对命令请求者(Invoker)和命令实现者(Receiver)的解耦,方便对命令进行各种控制. 模式结构 代码实现 场景: 去饭店吃烤串 代码: 点击下载 特点和使用场

大话设计模式读书笔记--7.模板方法模式

有时候,我们会遇到由一系列步骤构成的过程,这个过程从高层次上看是相同的,但有些步骤的实现可能不同,我们就要考虑使用模板方法 生活中的例子:坐交通工具上班,  A开车,B做公交, 交通工具就是一个抽象模板 定义 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类不改变算法的结构,即可重定义该算法的某些特定步骤 模式结构 AbstractClass:是一个抽象模板类,templateMethod()是模板方法,它是一个顶级逻辑的骨架,primitiveOperation()是一个

大话设计模式读书笔记6——代理模式

代理模式: 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. UML结构如下图: 代码实现: //定义一个Subject 抽象类 public abstract class Subject { public abstract void Request(); } //定义一个RealSubject类,继承Subject public class RealSubject : Subject { public override void Request() { Console.W