策略模式是行为设计模式 ,核心思想是定义算法族,分别封装,并且他们可以互相替换。
该模式使得算法独立于客户端变化,解决了场景中多种算法策略交叉混杂的问题。
使用场景
- 数据导出,需要导出为不同格式的数据(Excel、PDF、CSV等)
- 数据计算,需要执行不同的计算公式(加减、乘除等)
- 对接不同的数据库(mysql、pgsql等)
核心组件
-
策略接口 :strategy interface
-
定义算法的抽象协议
public interface Strategy{
void execute(Object obj);
}
-
-
策略实现类 :
-
具体算法的实现类,每一个策略实现一种独立算法
public class StringStrategy implements Strategy {
@Override
public void execute(Object obj) {
System.out.println("String:" + obj);
}
}public class IntegerStrategy implements Strategy {
@Override
public void execute(Object obj) {
System.out.println("Integer:" + obj);
}
}
-
-
上下文类 :Context
-
执行相关策略,将客户端和策略进行解耦
public class StrategyContext {
private Strategy strategy;public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void execute(Object obj) { strategy.execute(obj); }
}
-
类图

-
Application
:调用类 -
StrategyContext
:上下文类 -
Strategy
:抽象类 -
StringStrategy
:实现类public interface Strategy {
void execute(Object obj);
}
public class StringStrategy implements Strategy {
@Override
public void execute(Object obj) {
System.out.println("String:" + obj);
}
}public class StrategyContext {
private Strategy strategy; public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void execute(Object obj) { strategy.execute(obj); }
}
public class Application {
public static void main(String[] args) { StrategyContext strategyContext = new StrategyContext(); strategyContext.setStrategy(new StringStrategy()); strategyContext.execute("StringStrategy"); strategyContext.setStrategy(new IntegerStrategy()); strategyContext.execute(66); }
}
模式的优缺点
优点
- 消除了大量的判定(if-else,switch-case),提高了代码可读性
- 符合单一原则
- 支持动态切换算法
缺点
- 策略类可能无限增长
- 客户端需要了解不同策略的区别
总结
策略模式将算法从业务逻辑中解耦出来,是消除条件表达式的重要模式,能够很好的提高可读性。建议与工厂模式进行组合使用。