一、目的及参考
目的
提取重复代码,消除 if-else
参考
观看下文前请参考[设计模式-模板方法](https://blog.csdn.net/Moon_Light0/article/details/129954073?spm=1001.2014.3001.5501)
二、类图
三、代码
抽象模板类
public abstract class AbstractClass {
//基本方法
protected abstract void doSomething();
//基本方法
protected abstract void doAnything();
//模板方法 抽取子类公共逻辑
public void templateMethod(){
System.out.println("实现子类公共逻辑");
doSomething();
doAnything();
}
}
具体模板类
@Service("ConcreteLogicOne")
public class ConcreteLogicOne extends AbstractClass {
@Override
protected void doSomething() {
System.out.println("ConcreteLogicOne逻辑处理1");
}
@Override
protected void doAnything() {
System.out.println("ConcreteLogicOne逻辑处理2");
}
}
@Service("ConcreteLogicTwo")
public class ConcreteLogicTwo extends AbstractClass {
@Override
protected void doSomething() {
System.out.println("ConcreteLogicTwo逻辑处理1");
}
@Override
protected void doAnything() {
System.out.println("ConcreteLogicTwo逻辑处理2");
}
}
工具类
- 用于获取注入的Bean
@Component
public class SpringBeanUtil implements ApplicationContextAware {
public static ApplicationContext applicationContext;
public SpringBeanUtil() {
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringBeanUtil.applicationContext = applicationContext;
}
public static void regBean(String name, Object object) {
ConfigurableApplicationContext cc = (ConfigurableApplicationContext)applicationContext;
DefaultListableBeanFactory cf = (DefaultListableBeanFactory)cc.getBeanFactory();
cf.registerSingleton(name, object);
}
public static Object getBean(String name) {
try {
return applicationContext.getBean(name);
} catch (Exception var2) {
return null;
}
}
public static <T> T getBean(Class<T> clazz) {
try {
return applicationContext.getBean(clazz);
} catch (Exception var2) {
return null;
}
}
public static <T> T getBean(String name, Class<T> clazz) {
try {
applicationContext.getBeansOfType(clazz);
return applicationContext.getBean(name, clazz);
} catch (Exception var3) {
return null;
}
}
}
场景类
@RestController
@RequestMapping("/dev-api/design-pattern")
public class TemplateMethodController {
@GetMapping("/templateMethod")
public void templateMethod(){
AbstractClass concreteLogicOne = (AbstractClass)SpringBeanUtil.getBean("ConcreteLogicOne");
AbstractClass ConcreteLogicTwo = (AbstractClass)SpringBeanUtil.getBean("ConcreteLogicTwo");
//调用模板方法
concreteLogicOne.templateMethod();
ConcreteLogicTwo.templateMethod();
}
}
结果:
四、总结
- 我们在具体模板类上面加上了@Service(“ConcreteLogicOne”),这样类就被spring容器进行管理。
- 通过applicationContext获取Bean名称,获取到对应具体模板类,这里就借助spring容器使用到了工厂模式
- 工厂模式可以帮助我们消除if-else