• 结合Spring注册InitializingBean接口实现策略注册


    1. 结合策略模式+工厂模式+模板方法模式,消除if-else
    /**
     * @author: Yang
     * @date: 2020/8/9 23:46
     * @description:
     */
    @RestController
    @RequestMapping("/ifelse")
    public class IfElseOptController {
    
        @GetMapping("/one/{name}")
        public void one(@PathVariable String name) {
            Factory.getHandler(name).doSth();
        }
    
    
    }
    
    /**
     * 1.定义策略执行器接口
     */
    interface MyHandler extends InitializingBean {
    
        void doSth();
    
    }
    
    /**
     * 模板方法模式,AQS的tryRelease方法就有类似实现
     * 当某种业务的
     */
    abstract class MyAbstractHandlerTemplate implements InitializingBean {
    
        String doBiz() {
            throw new UnsupportedOperationException();
        }
    
        void doLogic() {
            throw new UnsupportedOperationException();
        }
    }
    
    /**
     * 2.策略执行器实现类
     */
    @Component
    class ZhangSan extends MyAbstractHandlerTemplate implements MyHandler {
    
        @Override
        String doBiz() {
            return "张三----------";
        }
    
        @Override
        public void doSth() {
            System.out.println(this.doBiz());
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            Factory.register("zhangsan", this);
        }
    }
    
    /**
     * 3.另一个策略执行器实现类,符合开闭原则--
     * 对新增开放:当新增策略执行器时,只需新增一个实现类,在其中编写业务逻辑和注册方法
     * 对修改关闭:其他类不会因此被修改
     */
    @Component
    class LiSi extends MyAbstractHandlerTemplate implements MyHandler {
    
        @Override
        void doLogic() {
            System.out.println("李四logic-------");
        }
    
        @Override
        public void doSth() {
            this.doLogic();
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            Factory.register("lisi", this);
        }
    }
    
    /**
     * 4.策略执行器工厂
     */
    class Factory {
    
        private static final Map<String, MyHandler> STRATEGY_MAP = new HashMap<>(8);
    
        static MyHandler getHandler(String name) {
            return STRATEGY_MAP.get(name);
        }
    
        static void register(String name, MyHandler handler) {
            STRATEGY_MAP.put(name, handler);
        }
    
    }
    
    学习使我充实,分享给我快乐!
  • 相关阅读:
    spring boot 2+activiti 6.0 手把手带你学习activiti
    js自定义验证码
    [C#] OpenXml导出Excel,设置单元格格式,自动设置列宽
    [WPF] 自定义分页控件,可通过样式模板修改外观
    [WPF] 默认滚动条,通过附加属性和样式实现自定义
    王道考研数据结构错题集
    django rest framework 反序列化过程剖析
    django rest framework响应数据的源码分析
    django rest framework序列化过程剖析
    java源码学习(二)Integer
  • 原文地址:https://www.cnblogs.com/JaxYoun/p/13551553.html
Copyright © 2020-2023  润新知