• 设计模式之策略模式


    策略模式(Strategy Pattern)

    定义

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

    使用场景

    主要角色

    类图

    image-20231224153459958

    示例代码

    //抽象策略角色
    public interface Strategy {
        //策略模式的运算法则
        void doSomething();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    //具体策略角色
    public class ConcreteStrategy1 implements Strategy {
        @Override
        public void doSomething() {
            System.out.println("具体策略1的运算法则...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    //具体策略角色
    public class ConcreteStrategy2 implements Strategy {
        @Override
        public void doSomething() {
            System.out.println("具体策略2的运算法则...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    //封装角色
    public class Context {
        //抽象策略
        private Strategy strategy;
    
        //构造函数设置具体策略
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
    
        //封装后的策略方法
        public void doAnything() {
            this.strategy.doSomething();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    public class Client {
        public static void main(String[] args) {
            //拿到一个具体的策略
            Strategy strategy = new ConcreteStrategy1();
            //创建上下文对象
            Context context = new Context(strategy);
            //执行封装后的方法
            context.doAnything();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用Spring实现策略模式+工厂模式

    public interface Strategy {
        //策略模式的运算法则
        void doSomething();
    }
    
    • 1
    • 2
    • 3
    • 4
    @Component("concreteStrategy1")
    public class ConcreteStrategy1 implements Strategy {
        @Override
        public void doSomething() {
            System.out.println("具体策略1的运算法则...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    @Component("concreteStrategy2")
    public class ConcreteStrategy2 implements Strategy {
        @Override
        public void doSomething() {
            System.out.println("具体策略2的运算法则...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    @Component("defaultStrategy")
    public class DefaultStrategy implements Strategy {
        @Override
        public void doSomething() {
            System.out.println("默认策略的运算法则...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    @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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    @SpringBootTest
    class SpringbootDemoApplicationTests {
    
        @Autowired
        private StrategyFactory strategyFactory;
    
        @Test
        public void test() {
            strategyFactory.getStrategy("concreteStrategy1").doSomething();
            strategyFactory.getStrategy("concreteStrategy2").doSomething();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    工作中遇到场景

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

  • 相关阅读:
    算法|每日一题|做菜顺序|贪心
    Java集合大总结——List的简单使用
    刷题之单词搜索(leetcode)
    STM32F4X SDIO(二) SDIO协议
    缓存预热Springboot定时任务
    视频剪辑素材哪里找?这个几个网站就够了。
    【JS高级】js面向对象三大特性之继承_06
    图书推荐管理系统Python+Django网页界面+协同过滤推荐算法
    领域驱动设计代码模型
    【B站UP DR_CAN学习笔记】Kalman滤波1
  • 原文地址:https://blog.csdn.net/weixin_41883161/article/details/136495780