现在的位置: 首页 > 综合 > 正文

设计模式学习3-Strategy模式

2012年10月16日 ⁄ 综合 ⁄ 共 1905字 ⁄ 字号 评论关闭

场景描述:

一觉醒来看下时间还有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模式处理这种变化的可能性。

 

抱歉!评论已关闭.