策略模式

策略模式适用于 需要经常改变算法实现的场景 比如商场的销售场景中(正常销售、返利销售、折扣),使得算法的改动不影响客户端的调用

using System;
using System.Collections.Generic;
using System.Text;

namespace 策略模式
{
    public class CashContext
    {
        private CashSuper super=null;

        public CashContext(CashInfo info)
        {
            switch (info.SaleType)
            {
                case "正常销售":
                    super = new CashC(info.Money);
                    break;
                case "返利":
                    super = new CashA(info.Money, info.MoneyCondition,info.MoneyReturn);
                    break;

                case "折扣":
                    super = new CashB(info.Money, info.MoneyCondition);
                    break;
                default:
                    throw new NullReferenceException("找不到对应的类型");
                    break;
            }
        }

        public double GetResult()
        {
            return super.AcceptCash();
        }
    }

    public struct CashInfo
    {
        public double Money { get; set; }
        public double MoneyCondition { get; set; }
        public double MoneyReturn { get; set; }
        public string SaleType { get; set; }
    }
}
View Code

 

using System;
using System.Collections.Generic;
using System.Text;

namespace 策略模式
{
    /// <summary>
    /// 返利
    /// </summary>
    public class CashA:CashSuper
    {
        private double _money;
        private double _moneyCondition;
        private double _returnMoney;
        public CashA(double money,double moneyCondition,double returnMoney)
        {
            this._money = money;
            this._moneyCondition = moneyCondition;
            this._returnMoney = returnMoney;
        }

        private double GetMoney()
        {
            return (_money-(Math.Floor(_money/_moneyCondition)*_returnMoney));
        }

        public override double AcceptCash()
        {
            Console.WriteLine("I'm A");
            return GetMoney();
        }
    }

    /// <summary>
    /// 打折
    /// </summary>
    public class CashB : CashSuper
    {
        private double _money;
        private double _moneyCondition;
        public CashB(double money, double moneyCondition)
        {
            this._money = money;
            this._moneyCondition = moneyCondition;
        }

        private double GetMoney()
        {
            return _money *_moneyCondition;
        }

        public override double AcceptCash()
        {
            Console.WriteLine("I'm B");
            return GetMoney();
        }
    }

    /// <summary>
    ///正常销售 
    /// </summary>
    public class CashC:CashSuper
    {
        private double _money;
        public CashC(double money)
        {
            this._money = money;
        }

        public override double AcceptCash()
        {
            return _money;
        }
    }
}
View Code

 

posted on 2013-07-02 15:55  王英磊  阅读(139)  评论(0)    收藏  举报

导航