zoukankan      html  css  js  c++  java
  • 【大话设计模式读书笔记——策略模式】

    策略模式

    策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
    策略模式的特点:
    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();
    
  • 相关阅读:
    es6 学习小计
    aligin-items与aligin-content的区别
    编写Shader时的一些性能考虑
    Shader预处理宏、内置状态变量、多版本编译等
    Unity内置的shader include files
    Vertex and Fragment Shader
    对于资源上MissingScript的清理方案讨论
    Surface Shader
    LOD设置
    《蛙》
  • 原文地址:https://www.cnblogs.com/q975261413/p/8117869.html
Copyright © 2011-2022 走看看