平时工厂+策略模式+模板我平时也喜欢用,但是今天看到一个案例,和spring bean的初始化方法InitializingBean结合得比较巧妙,记录下这种思路,代码很简单,但是这种设计方式平时很常用也很实用,以后遇到类似的情况可以套用
/**
* 工厂设计模式
*/
public class Factory {
private static Map<String, AbstractHandler> strategyMap = Maps.newHashMap();
public static AbstractHandler getInvokeStrategy(String str) {
return strategyMap.get(str);
}
public static void register(String str, AbstractHandler handler) {
if (StringUtils.isEmpty(str) || null == handler) {
return;
}
strategyMap.put(str, handler);
}
}
/**
* 模板方法设计模式
* 这里没必要纠结模板方法模式的官方用法
*/
public abstract class AbstractHandler implements InitializingBean {
public void AAA(String name) {
throw new UnsupportedOperationException();
}
public String BBB(String name) {
throw new UnsupportedOperationException();
}
}
@Component
public class KangBaHandler extends AbstractHandler {
@Override
public void AAA(String name) {
// 业务逻辑A
System.out.println("亢八完成任务");
}
/**
** 实现InitializingBean的接口方法
**/
@Override
public void afterPropertiesSet() throws Exception {
Factory.register("亢八", this);
}
}
@Component
public class LiSiHandler2 extends AbstractHandler {
@Override
public String BBB(String name) {
// 业务逻辑B
return "李四完成任务B";
}
@Override
public void afterPropertiesSet() throws Exception {
Factory.register("李四", this);
}
}
@Component
public class TianQiHandler extends AbstractHandler {
@Override
public void AAA(String name) {
// 业务逻辑A
System.out.println("田七完成任务A");
}
@Override
public void afterPropertiesSet() throws Exception {
Factory.register("田七", this);
}
}
// 工厂 + 策略 + 模板设计模式
@Test
void design() {
String name = "张三";
AbstractHandler strategy = Factory.getInvokeStrategy(name);
// strategy.AAA(name);
String str = strategy.BBB(name);
System.out.println(str);
}