设计模式 - 策略模式


  • 策略模式的好处

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

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);
        }
    }
}

推荐阅读更多精彩内容