策略模式

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

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


	/// <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();

 

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值