策略模式(Strategy Pattern)
定义
定义一系列算法,封装每个算法,并使它们可以互换。
使用场景
主要角色
类图
示例代码
java
//抽象策略角色
public interface Strategy {
//策略模式的运算法则
void doSomething();
}
java
//具体策略角色
public class ConcreteStrategy1 implements Strategy {
@Override
public void doSomething() {
System.out.println("具体策略1的运算法则...");
}
}
java
//具体策略角色
public class ConcreteStrategy2 implements Strategy {
@Override
public void doSomething() {
System.out.println("具体策略2的运算法则...");
}
}
java
//封装角色
public class Context {
//抽象策略
private Strategy strategy;
//构造函数设置具体策略
public Context(Strategy strategy) {
this.strategy = strategy;
}
//封装后的策略方法
public void doAnything() {
this.strategy.doSomething();
}
}
java
public class Client {
public static void main(String[] args) {
//拿到一个具体的策略
Strategy strategy = new ConcreteStrategy1();
//创建上下文对象
Context context = new Context(strategy);
//执行封装后的方法
context.doAnything();
}
}
使用Spring实现策略模式+工厂模式
java
public interface Strategy {
//策略模式的运算法则
void doSomething();
}
java
@Component("concreteStrategy1")
public class ConcreteStrategy1 implements Strategy {
@Override
public void doSomething() {
System.out.println("具体策略1的运算法则...");
}
}
java
@Component("concreteStrategy2")
public class ConcreteStrategy2 implements Strategy {
@Override
public void doSomething() {
System.out.println("具体策略2的运算法则...");
}
}
java
@Component("defaultStrategy")
public class DefaultStrategy implements Strategy {
@Override
public void doSomething() {
System.out.println("默认策略的运算法则...");
}
}
java
@Component
public class StrategyFactory {
//Spring会自动将Strategy接口的实现类注入到这个Map中,key为bean id,value值则为对应的策略实现类
@Autowired
private Map<String, Strategy> strategyMap;
public Strategy getStrategy(String strategyName) {
return strategyMap.get(strategyName);
}
}
java
@SpringBootTest
class SpringbootDemoApplicationTests {
@Autowired
private StrategyFactory strategyFactory;
@Test
public void test() {
strategyFactory.getStrategy("concreteStrategy1").doSomething();
strategyFactory.getStrategy("concreteStrategy2").doSomething();
}
}
工作中遇到场景
订阅视频平台事件(异常振动,蒸汽泄露,未带安全帽...),每个类型的事件对应一个处理类(策略类),后续可能还会订阅其他的事件.