1. 意图(Intent)
定义一系列算法,封装每个算法,并使它们可以互换。
策略模式可以让算法独立于使用它的客户端。
2. 类图(Class Diagram)

- Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。
- Context 是用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。
3. 实现(Implementation)
I 画图案例
首先,先定义一个策略接口:[ Strategy ]
public interface Strategy {public void draw(int radius, int x, int y);}
然后我们定义具体的几个策略:[ ConcreteStrategy ]
public class RedPen implements Strategy {@Overridepublic void draw(int radius, int x, int y) {System.out.println("用红色笔画图,radius:" + radius + ", x:" + x + ", y:" + y);}}
public class GreenPen implements Strategy {@Overridepublic void draw(int radius, int x, int y) {System.out.println("用绿色笔画图,radius:" + radius + ", x:" + x + ", y:" + y);}}
public class BluePen implements Strategy {@Overridepublic void draw(int radius, int x, int y) {System.out.println("用蓝色笔画图,radius:" + radius + ", x:" + x + ", y:" + y);}}
使用策略的类:[ Context ]
public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public int executeDraw(int radius, int x, int y){return strategy.draw(radius, x, y);}}
客户端演示:
public class Client {public static void main(String[] args) {Context context = new Context(new BluePen()); // 使用绿色笔来画context.executeDraw(10, 0, 0);}}
放到一张图上,让大家看得清晰些:
这个时候,大家有没有联想到结构型模式中的桥梁模式,它们其实非常相似,我把桥梁模式的图拿过来大家对比下:
要我说的话,它们非常相似,桥梁模式在左侧加了一层抽象而已。桥梁模式的耦合更低,结构更复杂一些。
II 鸭子案例
设计一个鸭子,它可以动态地改变叫声。这里的算法族是鸭子的叫声行为。
首先,先定义一个策略接口:[ Strategy ]
public interface QuackBehavior {void quack();}
然后我们定义具体的几个策略:[ ConcreteStrategy ]
//嘎嘎叫public class Quack implements QuackBehavior {@Overridepublic void quack() {System.out.println("quack!");}}
//吱吱叫public class Squeak implements QuackBehavior{@Overridepublic void quack() {System.out.println("squeak!");}}
使用策略的鸭子类:[ Context ]
public class Duck {private QuackBehavior quackBehavior;public void performQuack() {if (quackBehavior != null) {quackBehavior.quack();}}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior = quackBehavior;}}
客户端演示:
public class Client {public static void main(String[] args) {Duck duck = new Duck();duck.setQuackBehavior(new Squeak());duck.performQuack();duck.setQuackBehavior(new Quack());duck.performQuack();}}//输出结果://squeak! 嘎嘎叫//quack! 吱吱叫
4. JDK
- java.util.Comparator#compare()
- javax.servlet.http.HttpServlet
- javax.servlet.Filter#doFilter()
