- 结合策略模式+工厂模式+模板方法模式,消除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);
}
}