策略模式(Strategy Pattern)

一、策略模式的组成

  • 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。 
  • 具体策略角色:包装了相关的算法和行为。 
  • 环境角色:持有一个策略类的引用,最终给客户端调用。

 

二、 策略模式的概念

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

Context(应用场景):

  1. 需要使用ConcreteStrategy提供的算法。 
  2. 内部维护一个Strategy的实例。 
  3. 负责动态设置运行时Strategy具体的实现算法。 
  4. 负责跟Strategy之间的交互和数据传递。 

Strategy(抽象策略类): 

  1. 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。 

ConcreteStrategy(具体策略类): 

  1. 实现了Strategy定义的接口,提供具体的算法实现。

 

 三、策略模式的应用场景 

  1. 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。(例如FlyBehavior和QuackBehavior) 
  2. 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(例如FlyBehavior和QuackBehavior的具体实现可任意变化或扩充) 
  3. 对客户(Duck)隐藏具体策略(算法)的实现细节,彼此完全独立。

 

四、策略模式的优点

  • 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。 
  • 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。 
  • 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。 

 

五、策略模式的缺点

  • 由于每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量

 

六、策略模式的实例

 实例一:

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用JAVA程序怎么表现这个呢?我们先看类图:

三个妙计是同一类型的东东,那咱就写个接口:

1     //首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口
2 public interface IStrategy
3 {
4 void Operate();
5 }

然后再写三个实现类,有三个妙计嘛:

 1     //找乔国老帮忙,使孙权不能杀刘备
2 public class BackDoor: IStrategy
3 {
4
5 public void Operate()
6 {
7 Console.WriteLine("找乔国老帮忙,让吴国太给孙权施加压力");
8 }
9 }
10
11 //求吴国太开个绿灯
12 public class GivenGreenLight : IStrategy
13 {
14
15 public void Operate()
16 {
17 Console.WriteLine("求吴国太开个绿灯,放行!");
18 }
19 }
20
21 //孙夫人断后,挡住追兵
22 public class BlockEnermy : IStrategy
23 {
24
25 public void Operate()
26 {
27 Console.WriteLine("孙夫人断后,挡住追兵");
28 }
29 }

好了,大家看看,三个妙计是有了,那需要有个地方放这些妙计呀,放锦囊呀:

 1     //计谋有了,那还要有锦囊
2 public class Context
3 {
4 IStrategy strategy;
5
6 //构造函数,你要使用那个妙计
7 public Context(IStrategy strategy)
8 {
9 this.strategy = strategy;
10 }
11
12 //使用计谋了,看我出招了
13 public void Operate()
14 {
15 this.strategy.Operate();
16 }
17 }

然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅:

 1     //赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
2 public class ZhaoYun
3 {
4 static void Main(string[] args)
5 {
6 Context context;
7
8 //刚刚到吴国的时候拆第一个
9 Console.WriteLine("---刚刚到吴国的时候拆第一个--- ");
10 context = new Context(new BackDoor());
11 context.Operate();
12 Console.WriteLine("\n\n\n");
13
14 //刘备乐不思蜀了,拆第二个了
15 Console.WriteLine("---刘备乐不思蜀了,拆第二个了---");
16 context = new Context(new GivenGreenLight());
17 context.Operate();
18 Console.WriteLine("\n\n\n");
19
20 //孙权的小兵追了,咋办?拆第三个
21 Console.WriteLine("---孙权的小兵追了,咋办?拆第三个---");
22 context = new Context(new BlockEnermy());
23 context.Operate();
24 Console.WriteLine("\n\n\n");
25
26 Console.Read();
27 }
28 }
posted @ 2012-03-22 23:39  技术勇者  阅读(446)  评论(0编辑  收藏  举报