设计模式学习3-Strategy模式
场景描述:
一觉醒来看下时间还有30分钟才上班呢,笃笃定定穿好衣服,先抽根烟,然后去刷牙洗脸,慢悠悠上班去了;如果一觉醒来还有15分钟就迟到了,算了不抽烟了,穿好衣服,刷牙洗脸,急匆匆上班去了;如果一觉醒来只有5分钟了,肿么办!先花5秒钟平复一下心情,赶紧穿好衣服冲出去了!
可以发现,对于不同的起床时间做了不同的事情,如果用程序实现,有什么合适的模式吗?嗯,Strategy模式
Strategy模式(策略模式):
定义:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。将对算法的选择和算法的实现相分离。
实现:让使用算法的类(Context)包含一个抽象类(Strategy),该抽象类有一个抽象方法指定如何调用算法。每个派生类按需要实现算法。
结构图:
代码示例:
根据上面的场景描述,我们来实现一下Strategy模式。
首先先定义抽象类(Strategy):
1 public interface IStrategy { 2 void AlgorithmInterface(); 3 }
然后定义子类并实现它们,这3个子类分别对应场景中的3种情况。可以看出子类封装了各自的算法(业务规则)。
1 public class ConcreteStrategyA : IStrategy { 2 public void AlgorithmInterface() { 3 Console.WriteLine("穿衣服"); 4 Console.WriteLine("抽根烟,爽!"); 5 Console.WriteLine("刷牙和洗脸"); 6 } 7 } 8 9 public class ConcreteStrategyB : IStrategy { 10 public void AlgorithmInterface() { 11 Console.WriteLine("穿衣服"); 12 Console.WriteLine("刷牙和洗脸"); 13 } 14 } 15 16 public class ConcreteStrategyC : IStrategy { 17 public void AlgorithmInterface() { 18 Console.WriteLine("穿衣服!跑!"); 19 } 20 }
下面定义使用算法的类Context,从下面的代码中可以看出Context并不知道它使用的是哪个具体的IStrategy(这个就是类型封装),这样的好处是如果以后增加了新的算法不需要修改Context类。
1 public class Context { 2 public Context(IStrategy strategy) { 3 this.strategy = strategy; 4 } 5 6 public void ContextInterface() { 7 this.strategy.AlgorithmInterface(); 8 } 9 10 private IStrategy strategy; 11 }
最后是Client类,可以看出选择所用具体子类由Client承担,并转给Context对象,实现了算法的选择和算法的实现相分离。
1 class Client { 2 static void Main(string[] args) { 3 Console.WriteLine("还有30分钟呢,不急 =>"); 4 Context context1 = new Context(new ConcreteStrategyA()); 5 context1.ContextInterface(); 6 Console.WriteLine("=================================="); 7 8 Console.WriteLine("还有15分钟 =>"); 9 Context context2 = new Context(new ConcreteStrategyB()); 10 context2.ContextInterface(); 11 Console.WriteLine("=================================="); 12 13 Console.WriteLine("尼玛,只有5分钟了啊! =>"); 14 Context context3 = new Context(new ConcreteStrategyC()); 15 context3.ContextInterface(); 16 Console.WriteLine("=================================="); 17 18 Console.ReadLine(); 19 }
运行的结果:
总结:
一般来说,只要在分析过程中需要在不同时间应用不同业务规则,就应该考虑使用Strategy模式处理这种变化的可能性。