来自 xiaoclient http://www.blogjava.net/xiaosilent/archive/2006/11/05/79258.html
策略模式就是定义一组算法,所有的这些算法都是做同一件事情,只是他们实现的方式不同。

给大家讲了一个销售税算法的例子。在一个国际性的电子商务系统里,对不同国家的客户可能会存在不同的销售税算法。策略模式使得我们可以封装这些算法到一个抽象类中,并从这个抽象类派生出一系列的具体类来完成不同国家的具体算法。

通过从抽象类派生出不同算法的方式,程序的主模块 ( 如上例中的 SalesOrder) 不必考虑确切算法类型,这样就允许新变化的出现,随后在 16 章,我们继续讲如何处理这些变化。

策略模式主要功能

目标

使我们可以根据不同客户端对象采用不同算法

环境

具体算法的选择取决于具体的客户对象的类型

解决方式

把算法的选择和算法的实现分离开来,再根据客户对象进行选择

参与方式

  • Strategy 指明不同算法将如何被使用

  • ConcreteStrategies 具体实现不同算法

  • Context 通过 Strategy 使用确切的 ConcreteStrategy Strategy Context 进行交互以实现算法的选择 ( 有时 Strategy 必须查询 Context) Context 把请求从客户端传递给 Strategy

结果

  • 策略模式定义一组算法

  • 使用 Switches 语句和 if-else 的方式被抛弃

  • 必须以相同方式调用所有算法 ( 所有算法必须有相同接口 ) ConcreteStrategies Context 的交互可能需要额外的方法以从 Context 里获取程序的状态。

执行方式

让使用到算法的类 (Context) 包含一个包含了如何调用具体算法的抽象方法的抽象类 (Strategy) 。每个派生类根据需要实现具体算法。


9-6 策略模式通用结构