策略模式-Strategy
名称:
策略模式(Strategy Pattern)-对象行为模式
问题:
The intent of the Strategy Pattern is to define a family of algorithms, encapsulate each algorithm, and make them interchangeable. The Strategy Pattern lets the algorithm vary independently from clients that use it. In addition the pattern, defines a group of classes that represent a set of possible behaviors. These behaviors can then be used in an application to change its functionality.
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
适用性:
-许多相关的类仅仅是行为有异。
-需要使用一个算法的不同变体。
-算法使用客户不应该知道的数据。
-一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
协作:
-Strategy和Context相互作用以实现选定的算法。当算法被调用时,Context可以将该算法所需要的所有数据都传递给该Stategy。或者,Context可以将自身作为一个参数传递给Strategy操作。这就让Strategy在需要时可以回调Context。
-Context将它的客户的请求转发给它的Strategy。客户通常创建并传递一个ConcreteStrtegy对象给该Context;这样,客户仅与Context交互。通常有一系列的ConcreteSrategy类可供客户从中选择。
优点和缺点:
1、相关算法系列。
2、一个替代继承的方法。
3、消除了一些条件语句。
4、实现的选择。
5、客户必须了解不同的Strategy。
6、Strategy和Context之间的通信开销。
7、增加了对象的数目。
解决方案:
1、 模式的参与者
1、Strategy
-定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
2、ConcreteStrategy
-以Strategy接口实现某具体算法。
3、ConText
-用一个ConcreteStrategy对象来配置。
-维护一个对Strategy对象的引用。
-可定义一个接口来让Strategy访问它的数据。
2.实现方式
interface Strategy { public void method(); }
class ConcreteStrategyA implements Strategy { public void method() { System.out.println("A method!"); } }
class ConcreteStrategyB implements Strategy { public void method() { System.out.println("B method"); } }
class Context { private Strategy strategy; public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy=strategy; } public void method() { strategy.method(); } }
参考资料
《设计模式:可复用面向对象软件的基础》