策略模式

来源:互联网 发布:jquery.min.js 使用 编辑:程序博客网 时间:2024/06/05 03:55

         策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户;

         接着上面可乐的话题说下去吧,现在小乙开了个冷饮店,可以选择三种可乐,在最初阶段,他不熟悉经常来得客户的口味,所以每次客户来都得先说需要什么可乐,小乙然后将可乐送出,下面看看这个过程的实现代码:


/// <summary>    /// 可乐基类    /// </summary>    public class Cola    {        public virtual string KeLe()        {            return "I'm KeLe";        }    }    /// <summary>    /// 可乐工厂类    /// </summary>    public static class ColaFactroy    {        public static Cola GetCola(string custem)        {            switch (custem)            {                case "A":                    return new BaiShi();                case "B":                    return new KeKou();                default:                    return new FeiChang();            }        }    }    /// <summary>    /// 可口可乐    /// </summary>    public class KeKou : Cola    {        public override string KeLe()        {            return "I'm KeKouKeLe";        }    }    /// <summary>    /// 可口可乐    /// </summary>    public class BaiShi : Cola    {        public override string KeLe()        {            return "I'm BaiShiKeLe";        }    }    /// <summary>    /// 非常可乐    /// </summary>    public class FeiChang : Cola    {        public override string KeLe()        {            return "I'm FeiChangKeLe";        }    }小乙卖可乐的实现如下:1.A顾客前来买可乐:Cola cola = ColaFactroy.GetCola("A");cola.KeLe();2.B顾客前来买可乐:Cola cola = ColaFactroy.GetCola("B");cola.KeLe();

         通过上面的代码可以看到,其实上面就是一个简单的工厂模式,小乙让用户直接对可乐工厂输入自己的爱好,可乐工厂将可乐做好后送出来;过了一阵子,顾客不高兴了,为什么?每次来买可都是对着可乐工厂说话,没看到老板小乙,顾客当然不高兴了,小乙想:通过什么样的策略来满足客户的需求呢?

         实际最好的情况应该是:小乙看到A或B客户走过来,通过对A和B的习惯分别制定不同的销售策略,满足客户的需求,看看下面的代码:


    /// <summary>    /// 可乐基类    /// </summary>    public class Cola    {        public virtual string KeLe()        {            return "I'm KeLe";        }    }/// <summary>    /// 老板小乙    /// </summary>    public class XiaoYi    {        private Cola _cola;        public XiaoYi(Cola cola)        {            this._cola = cola;        }        public String GetCola()        {            return _cola.KeLe();        }    }    /// <summary>    /// 可口可乐    /// </summary>    public class KeKou : Cola    {        public override string KeLe()        {            return "I'm KeKouKeLe";        }    }    /// <summary>    /// 可口可乐    /// </summary>    public class BaiShi : Cola    {        public override string KeLe()        {            return "I'm BaiShiKeLe";        }    }    /// <summary>    /// 非常可乐    /// </summary>    public class FeiChang : Cola    {        public override string KeLe()        {            return "I'm FeiChangKeLe";        }}

现在客户走过来之后,拿到可乐的代码应该是像下面这样的:

1.  小乙看到A客户走过来,因为熟悉A喜欢那种可乐,所以小乙马上开始准备:

XiaoYi xiaoyi = new XiaoYi(new BaiShi());

    this.label1.Text = xiaoyi.GetCola();

 

通过对简单工厂模式和策略模式的比较,我们可以看到:简单工厂模式是通过类的多态性,通过工厂直接返回子类,在客户端访问子类的属性或方法;

策略模式是通过对子类的封装,在客户端进行子类的实例化后作为参数传入策略类,对策略类进行实例化,由策略类返回客户端需要的计算结果;


原创粉丝点击