设计模式之策略模式

策略模式(Strategy Pattern)

定义

定义一系列算法,封装每个算法,并使它们可以互换。

使用场景

主要角色

类图

image-20231224153459958

示例代码

//抽象策略角色
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<String, Strategy> 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();
    }
}

工作中遇到场景

订阅视频平台事件(异常振动,蒸汽泄露,未带安全帽…),每个类型的事件对应一个处理类(策略类),后续可能还会订阅其他的事件.

相关推荐

  1. 设计模式策略模式

    2024-03-10 22:00:04       30 阅读
  2. 设计模式策略模式

    2024-03-10 22:00:04       33 阅读
  3. 设计模式策略模式

    2024-03-10 22:00:04       18 阅读
  4. 设计模式策略模式

    2024-03-10 22:00:04       15 阅读
  5. 设计模式策略模式

    2024-03-10 22:00:04       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 22:00:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 22:00:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 22:00:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 22:00:04       20 阅读

热门阅读

  1. GRU-深度学习循环神经网络情感分类模型搭建

    2024-03-10 22:00:04       21 阅读
  2. 学习数据结构和算法的地13天

    2024-03-10 22:00:04       20 阅读
  3. 函数柯里化(function currying)及部分求值

    2024-03-10 22:00:04       20 阅读
  4. vue中常用的指令和自定义指令

    2024-03-10 22:00:04       20 阅读
  5. 打印前端代码

    2024-03-10 22:00:04       24 阅读
  6. [leetcode] 283. 移动零

    2024-03-10 22:00:04       21 阅读
  7. 我耀学IT—day06-导航栏

    2024-03-10 22:00:04       17 阅读
  8. 用spark读取及存储数据

    2024-03-10 22:00:04       24 阅读
  9. Gson(List<Object>转String 、String转List<Object>)

    2024-03-10 22:00:04       17 阅读
  10. 手机中常用的传感器

    2024-03-10 22:00:04       18 阅读
  11. vuej介绍

    2024-03-10 22:00:04       26 阅读
  12. 常见的排序算法-(字解版)

    2024-03-10 22:00:04       27 阅读
  13. 基于动态内存设计的通讯录

    2024-03-10 22:00:04       18 阅读