设计模式 - 策略模式


  • 策略模式的好处

    • 可以将相同功能定义成一个模块放在一起,比如对应一个业务逻辑的多种算法。
    • 首先,设计一个算法的基类,其他各个不同类型的算法类分别继承基类。
    • 之后,再创建一个暴露给客户端的 控制类,由控制类去判断应该生成具体的哪个子类。
    • 这样设计的好处:对于客户端来说,只需要知道这个控制类就可以了,其余的事情由控制类来做,这样也降低了耦合性。
  • 实现举例
    这里实现的是一个超市打折的策略,具体需求是打折的方式可能有多种,打折、返现...这里采用的是工厂+策略的设计模式

using System;
namespace Strategy
{
    //支付 Base 类
    abstract class CashSuper
    {
        public abstract double acceptMoney(double money);
    }
    //普通 支付
    class CashNormal : CashSuper
    {
        private double money  = 1d;
        public CashNormal(double money){
            this.money = money;         
        }
        public override double acceptMoney(double money){
            return this.money;
        }
    }
    //支付返现
    class CashReturn: CashSuper
    {
        private double fullMoney = 0d;
                double returnMoney = 0d;
        public CashReturn(double fullM,double returnM){
            this.returnMoney = returnM;
            this.fullMoney = fullM;
        }
        public override double acceptMoney(double money){
            if (money >= fullMoney) {
                return money - this.returnMoney;
            } else {
                return money;
            }
        }
    }
    //打折
    class CashRebate: CashSuper
    {
        private double moneyRebate = 1d;
        public CashRebate(string moneyRebate){
            this.moneyRebate = double.Parse(moneyRebate);
        }
        public override double acceptMoney(double money){
            return money*this.moneyRebate;
        }
    }
    //暴露给客户端的接口设计类
    class CashContext
    {
        CashSuper strategy = null;
        public CashContext(double money){
            CashNormal cs = new CashNormal(money);
            this.strategy = cs;
        }
        public CashContext(string rebate)
        {
            CashRebate cs = new CashRebate (rebate);
            this.strategy = cs;
        }
        public CashContext(double returnM,double fullM)
        {
            CashReturn cs = new CashReturn (fullM, returnM);
            this.strategy = cs;
        }
        public double GetResult(double money){
            return this.strategy.acceptMoney(money);
        }
    }
      //使用方式
    class MainClass
    {
        public static void Main (string[] args)
        {
            CashContext a =new CashContext(1000,200);
            double r = a.GetResult (1200);
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 策略模式,顾名思义,我是没看懂。 不知道为什么称它为策略模式,但通过学习,我知道这种模式可以让我的代码分工明确,实...
    废柴傻狗阅读 696评论 1 6
  • 策略模式——《设计模式之禅》 很好理解的例子 刘备江东娶亲,三个锦囊妙计 一个接口,三个实现类,三个锦囊妙计 封装...
    书笔年华阅读 244评论 0 0