【大話設計モード読書ノート・ポリシーモード】

3702 ワード

ポリシーモード
戦略モードはソフトウェア設計モードとして、オブジェクトにある行為を指すが、異なるシーンにおいて、この挙動は異なる実現アルゴリズムを有する.例えば、一人一人が「個人所得税を納める」ということですが、「米国で個人所得税を納める」と「中国で個人所得税を納める」は違います.策略のモードの特徴:1.一族の計算方法(業務規則)を定義しました.2.各アルゴリズムを実装しました.3.この族のアルゴリズムは互換可能です.ウィキペディア-ポリシーモード
戦略モデルはデパートの割引を実現します.
 /// 
    ///     
    /// 
    public abstract class CashSuper
    {
        public abstract double acceptCash(double money);
    }

    /// 
    ///      
    /// 
    public class CashNormal : CashSuper
    {
        public override double acceptCash(double money)
        {
            return money;//    ,    
        }
    }

    /// 
    ///    
    /// 
    public class CashRebate : CashSuper
    {
        private double _moneyRebate = 1d;//  

        public CashRebate(double moneyRebate)
        {
            this._moneyRebate = moneyRebate;
        }

        public override double acceptCash(double money)
        {
            return money * _moneyRebate;
        }
    }
    /// 
    ///     (  X ,  Y )
    /// 
    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;
        }
    }

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

    /// 
    ///      
    /// 
    public class CashContext
    {
        private readonly CashSuper cash;

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

        /// 
        ///      
        /// 
        /// 
        /// 
        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