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