结合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);
    }

}
学习使我充实,分享给我快乐!
原文地址:https://www.cnblogs.com/JaxYoun/p/13551553.html