策略模式的意图:
定义一系列的算法,把它们一个个的封装起来,并且使它们可以互相替换。本模式使算法可以独立于使用它的客户而变化。
该模式具有以下特征:
1、完成一件事不止有一种可以选择的方法,或者虽然现在是唯一的,但预期会不断改进或需要“备胎”。
2、各方法视图解决的是同一件事。
3、每个方法是独立于其它方法的。
4、方法的取舍因时、因势、因人而异,临场处置时择优选择一个。
策略模式的结构图如下:
Strategy(策略):定义所有支持的算法的公共接口。Context使用这个接口来调用某个ConcreteStrategy定义的算法。
ConcreteStrategy(具体策略):以Strategy接口实现的某种具体算法。
Context(上下文):用一个ConcreteStrategy对象来配置。
维护一个对Strategy对象的引用。
可定义一个接口来让Strategy访问它的数据。
策略模式的Java代码实现:
测试代码如下:
策略模式的适用性:
1、许多相关的类仅仅是行为不同。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
2、需要使用一个算法的不同变体。
3、算法使用客户不应该知道的数据,可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4、一个类定义多个行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。
策略模式的优缺点:
1、相关算法系列 Strategy类层次为Context定义了一系列的可供重用的算法或行为。
2、一个替代继承的方法 继承提供了另一种支持多种算法或行为的方法。可以直接生成一个Context类的子类,从而给它不同的行为。而将算法封装在独立的Strategy类中使得
你可以独立于其Context改变它,使它易于切换,易于理解,易于扩展。
3、实现的选择 Strategy模式可以提供相同的行为的不同的实现。
4、消除了一些条件语句 Strategy模式提供了用条件语句选择所需的行为以外的另一种选择。
5、客户必须了解不同的Strategy 本模式有一个潜在的缺点,就是一个客户要选择一个合适的Strategy就必须知道这些Strategy到底有何不同。
6、Strategy与Context之间的通信开销。
7、增加了对象的数目。