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

策略模式

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
策略模式的特点:
1.定义了一族算法(业务规则);
2.封装了每个算法;
3.这族的算法可互换代替(interchangeable)。
维基百科-策略模式

策略模式实现商场打折

 /// <summary>
    /// 收费基类
    /// </summary>
    public abstract class CashSuper
    {
        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(double moneyRebate)
        {
            this._moneyRebate = moneyRebate;
        }

        public override double acceptCash(double money)
        {
            return money * _moneyRebate;
        }
    }
    /// <summary>
    /// 返利收费(即满X元,返利Y元)
    /// </summary>
    public class CashReturn : CashSuper
    {
        private double _moneyCondition = 0.0d;//满X元
        private double _moneyReturn = 0.0d;//返利Y元

        public CashReturn(string moneyCondition, string moneyReturn)
        {
            this._moneyCondition = double.Parse(moneyCondition);
            this._moneyReturn = double.Parse(moneyReturn);
        }

        public override double acceptCash(double money)
        {
            double result = money;
            if (money >= _moneyCondition)
            {
                result = money - ((money / _moneyReturn) * _moneyReturn);//计算总金额减去返利金额之后的值
            }
            return result;
        }
    }

    /// <summary>
    /// 获取收费方式的工厂类
    /// </summary>
    public class CashFactory
    {
        public static CashSuper CreateCashAccept(string type)
        {
            CashSuper cashSuper = null;
            switch (type)
            {
                case "正常收费":
                    cashSuper = new CashNormal();
                    break;
                case "满300减100":
                    cashSuper = new CashReturn("300", "100");
                    break;
                case "折扣":
                    cashSuper = new CashRebate(0.8);
                    break;
            }
            return cashSuper;
        }
    }

    /// <summary>
    /// 收费上下文
    /// </summary>
    public class CashContext
    {
        private readonly CashSuper cash;

        /// <summary>
        /// 构造方法传入具体的收费策略
        /// </summary>
        /// <param name="type">收费方式</param>
        public CashContext(string type)
        {
            switch (type)
            {
                case "正常收费":
                    cash = new CashNormal();
                    break;
                case "满300减100":
                    cash = new CashReturn("300", "100");
                    break;
                case "折扣":
                    cash = new CashRebate(0.8);
                    break;
            }
        }

        /// <summary>
        /// 计算结果值
        /// </summary>
        /// <param name="money"></param>
        /// <returns></returns>
        public double GetResult(double money)
        {
            if (cash != null) return cash.acceptCash(money);
            return -1;
        }
    }

客户端调用

            var cash = new CashContext("折扣");//对外只用暴露一个类
            var result = cash.GetResult(500);
            Console.WriteLine(result);
            Console.ReadLine();
原文地址:https://www.cnblogs.com/q975261413/p/8117869.html