策略模式(Strategy Pattern)也叫政策模式,是一种比较简单的模式。
它的目的是定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,使得算法可以在不影响到客户端的情况下发生变化。
策略模式的通用类图如下图所示:

策略模式涉及以下3个角色:
| 角色 | 说明 |
|---|---|
| 环境(Context)角色 | 该角色也叫上下文角色,起到承上启下的作用,屏蔽高层模块对策略、算法的直接访问,它持有一个Strategy类的引用。 |
| 抽象策略(Strategy)角色 | 该角色对策略、算法进行抽象,通常定义每个策略或算法必须具有的方法和属性。 |
| 具体策略(Concrete Strategy)角色 | 该角色实现抽象策略中的具体操作,含有具体的算法。 |
抽象策略Strategy的代码如下所示:
package com.shixun.design.strategy;
/**
* 抽象策略 Strategy类
*/
public abstract class Strategy {
public abstract void strategyInterface();
}
具体策略ConcreteStrategy的代码如下所示:
package com.shixun.design.strategy;
/**
* 具体策略 ConcreteStrategy 类
* 实现抽象策略中的具体操作,含有具体的算法
*/
public class ConcreteStrategy extends Strategy {
@Override
public void strategyInterface() {
System.out.println("呜呼啦呼,实现具体策略!");
}
}
环境角色Context的代码如下所示:
package com.shixun.design.strategy;
public class Context {
private Strategy strategy = null;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void contextInterface() {
this.strategy.strategyInterface();
}
}
编写测试代码:
package com.shixun.design.strategy;
public class Test {
public static void main(String[] args) {
Context context = new Context(new ConcreteStrategy());
context.contextInterface();
}
}
运行结果如下所示:

策略模式包括如下优点:
策略模式包括如下缺点:
策略模式有如下几个应用场景:
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
定义抽象策略接口
public interface Strategy {
public int doOperation(int num1, int num2);
}
创建实现接口的具体策略类:
两数加法算法:
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
两数减法算法:
public class OperationSubtract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
两数乘法算法:
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
创建 Context 类:
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
编写测试类:
public class Test{
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
运行结果:
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50