本文最后更新于372 天前,其中的信息可能已经过时,如有错误请发送邮件到2192492965@qq.com
策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换使用。策略模式让算法的变化独立于使用算法的客户。这种模式通常用于替代大量的
if-else 或 switch-case 语句,使得代码更加灵活和可维护。
组成部分:
- Strategy Interface:定义所有支持的算法的公共接口。
- Concrete Strategies:实现策略接口的具体算法。
- Context:使用策略接口来调用具体的算法。
实现步骤
- 定义策略接口:这个接口规定了所有策略类必须实现的方法。
- 实现具体策略:为每种算法实现一个策略类。
- 创建上下文环境:上下文环境使用策略接口来调用具体的策略。
- 配置和使用:在运行时动态地配置上下文环境使用的具体策略。
普通策略模式的实现
// 接口
public interface Strategy {
void execute();
}
// 实现
// A
public class ConcreteStrategyA implements Strategy {
@Override
public void execute() {
System.out.println("这里是策略A");
}
}
// B
public class ConcreteStrategyB implements Strategy {
@Override
public void execute() {
System.out.println("这里是策略B");
}
}
// 策略上下文
public class Context {
private Strategy strategy;
public Context(ConcreteStrategyA strategy) {
this.strategy = strategy;
}
public void setStrategy(ConcreteStrategyB strategy) {
this.strategy = strategy;
}
public void executeStrategy() {
strategy.execute();
}
}
// 测试
public class Main {
public static void main(String[] args) {
Context context = new Context(new ConcreteStrategyA());
context.executeStrategy();
context.setStrategy(new ConcreteStrategyB());
context.executeStrategy();
}
}
动态策略模式的实现
动态策略模式可以融入Map和枚举,以实现可以通过策略上下文动态调用策略,也可以方便的维护程序
策略接口和普通实现无异
如果要添加策略,可以先向策略枚举中添加枚举元素,再将具体的策略实现类放入策略上下文的Map中
// 策略枚举
public enum StrategyEnum {
STRATEGY_A,
STRATEGY_B;
StrategyEnum() {
}
}
// 动态策略上下文
public class DynamicContext {
private static final Map<StrategyEnum, Strategy> strategyMap = new HashMap<StrategyEnum, Strategy>() {{
put(StrategyEnum.STRATEGY_A, new ConcreteStrategyA());
put(StrategyEnum.STRATEGY_B, new ConcreteStrategyB());
}};
public static void execute(StrategyEnum strategyName) {
Strategy strategy = strategyMap.get(strategyName);
strategy.execute();
}
}
使用起来也非常方便,
public class Main {
public static void main(String[] args) {
// 动态策略模式
DynamicContext.execute(StrategyEnum.STRATEGY_A);
DynamicContext.execute(StrategyEnum.STRATEGY_B);
}
}




