设计模式4-策略模式

  本篇开始及以后还是把设计模式的解释加上吧!

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

  首先,还是老规矩,先进行例子模拟、代码展示在谈自己的理解、看法以及疑惑。(直接拿来主义,使用《大话设计模式》中策略模式的例子)商场卖东西,为了促销总会想出各种各样的方式,什么满300减50呀、满600减70呀,如果碰到节假日来个打九折呀、打八折呀、打九折同时满300减50呀等等的。现在需要实现这一需求,该怎么写代码呢?当然啦,最简单的还是if-else语句,然后改进成为简单工厂模式,最后策略模式(这里在代码完成后再来描述自己的疑惑):

  首先,抽象策略类,实现策略具体类:

 1 /// <summary>
 2     /// 抽象策略类
 3     /// </summary>
 4     public abstract class AbsStrategy
 5     {
 6         public abstract void Do();
 7     }
 8     /// <summary>
 9     /// 策略一
10     /// </summary>
11     public class StrategyOne : AbsStrategy
12     {
13         public override void Do()
14         {
15             Console.WriteLine("你使用了策略一");
16         }
17     }
18     /// <summary>
19     /// 策略二
20     /// </summary>
21     public class StrategyTwo : AbsStrategy
22     {
23         public override void Do()
24         {
25             Console.WriteLine("你使用了策略二");
26         }
27     }
28     /// <summary>
29     /// 策略三
30     /// </summary>
31     public class StrategyThree : AbsStrategy
32     {
33         public override void Do()
34         {
35             Console.WriteLine("你使用了策略三");
36         }
37     }

  然后,编写策略的调用类:

 /// <summary>
    /// 策略调用类
    /// </summary>
    public class StrategyContext
    {
        AbsStrategy strategy;
        public StrategyContext(AbsStrategy str)
        {
            this.strategy = str;
        }

        public void StrategyContextDo()
        {
            strategy.Do();
        }
    }

   到这里,策略模式的实现方式就写完了,代码简单也就不去在做解释了。现在把简单工厂的实现也贴出来,方便对比:

/// <summary>
    /// 简单工厂
    /// </summary>
    public class SimpleFactory
    {
        public AbsStrategy GetStrategy(string strategyName)
        {
            if (strategyName == "策略一")
            {
                return new StrategyOne();
            }
            if (strategyName == "策略二")
            {
                return new StrategyTwo();
            }
            if (strategyName == "策略三")
            {
                return new StrategyThree();
            }
            return null;
        }
    }

  可以明显的看到:如果在新增一个策略四,简单工厂模式需要在增加一个if分支(当然不用if用switc是一样的),但是在客户端(执行主程序未贴出)是不用进行代码的修改的。而如果使用策略模式,策略调用代码不需要进行修改,但是在客户端是需要修改的,并且,策略的变化放在了客户端代码中(代码与简单工厂相似),经验不足,我也不知道那种方式好。在《大话设计模式》中,最终将代码改为了策略模式+简单工厂,即将分支语句放入了策略调用类中,自己的感觉就是确实要比前面好,把变化放在了外面而不影响主程序,但如果新增策略,策略调用类还是会被修改的。

  总结:策略模式是个什么东西,怎么个逻辑倒是了解了,但还是无法体会好处,自己认为是编码经验少了,没有那种原来如此的感觉。

posted @ 2019-01-15 09:23  RジP  阅读(158)  评论(0)    收藏  举报