设计模式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是一样的),但是在客户端(执行主程序未贴出)是不用进行代码的修改的。而如果使用策略模式,策略调用代码不需要进行修改,但是在客户端是需要修改的,并且,策略的变化放在了客户端代码中(代码与简单工厂相似),经验不足,我也不知道那种方式好。在《大话设计模式》中,最终将代码改为了策略模式+简单工厂,即将分支语句放入了策略调用类中,自己的感觉就是确实要比前面好,把变化放在了外面而不影响主程序,但如果新增策略,策略调用类还是会被修改的。
总结:策略模式是个什么东西,怎么个逻辑倒是了解了,但还是无法体会好处,自己认为是编码经验少了,没有那种原来如此的感觉。

浙公网安备 33010602011771号