Design Patterns(二十二):Strategy Pattern--VB代码

结构图

 

角色

  • 环境(Context)角色:持有一个Strategy类的引用。
  • 抽象策略者(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略者对象所需的接口。
  • 具体策略者(ConcreteStrategy)角色:封装了相关的算法和行为。通过对抽象策略者的多态派生,支持算法的变化。

动机

  在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。
    如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?

意图

  
定义一系列算法,把它们一个一个封装起来,并且使它们可互相转换。该模式使得算法可独立于使用它的客户而变化。

示意性代码

示意性代码

 

 一个实例

 下面的例子利用策略模式在排序对象中封装了不同的排序算法,这样以便允许客户端动态的替换排序策略(包括Quicksort、Shellsort和Mergesort)。

实例代码

 

Strategy Pattern模式的几个要点:
   1、Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。所谓封装算法,支持算法的变化。
   2、Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需Strategy模式。
       3、与State类似,如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。

我的理解

封装算法,支持算法的变化。

参考资料
《C#面向对象设计模式纵横谈系列课程(23)》     李建中老师