一、什么是策略模式

策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。UML结构图如下:
image.png
某种程度上,只要设计一个Java 的抽象类型,就可以说使用了策略模式。因为该抽象类型总会存在用户,而该用户类型即环境类。如果将抽象类型IServer视为策略的类层次,那么面向对象领域最常见的Client→IServer结构,即应用了策略模式,策略模式的运用无处不在。

二、策略模式的拓展

环境类多次使用策略模式称为多重策略,这将导致模板方法模式、桥接模式、装饰模式等模式的出现。多重策略的主要作用是避免子类爆炸
如果 Test 类有两个抽象方法——method1()与method2(),如果两个抽象方法分别有 m 和 n 种实现,则 Test 因为两个方法实现的任意组合,会导致它可以有 m*n 个子类型。也就是说,方法实现的任意组合将导致 Test 的子类型数量急剧膨胀。

为了避免类型(数量)的爆炸,一般将对 Test 进行如下步骤的重构。

  1. 以接口 IM1 和 IM2 分别封装抽象方法 method1()与method2() 。显然不应该让 Test 实现接口:public abstract class Test implements IM1, IM2。这对解决子类爆炸问题没有帮助。
  2. 以 Test 作为环境类(context),Test 将使用(has-s关系)这两个接口。使用IM1和IM2时,既可以将它们作为成员变量,也可以作为参数。
  3. Test 则从抽象类返璞归真为具体的工具类。

模板方法模式、桥接模式、装饰模式等等均面临类型爆炸问题,所以都使用了多重策略。