携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情 >>
【设计模式】模板方法模式详解
模板方法模式的定义
什么叫做“模板方法模式”?
其实,模板方法模式就是:先确定的是程序执行的大体框架(包括整体顺序),而其中一些细致的步骤变换延迟到子类中。模板方法模式可以增强扩展性,使得子类可以在不改变程序结构的前提下,重定义该程序的某些特定步骤。
模板方法模式的理解
其实,简单点来说,模板方法模式就是将不变的行为定义在超类,由子类来实现某步骤的细节变化。
使用模板方法模式的标志:
- 存在由一系列步骤构成的过程需要执行
- 这个过程从整体上看(高层次)是相同的
- 但是在这个过程中的某些步骤的实现有所不同
模板方法模式在Spring中的应用
上面我们已经详细讲述了什么是模板方法模式以及模板方法模式的一个使用场景,那么接下来就让我们一起来看看一个具体的例子吧。
(下面我们一起来学习一下Spring中是如何应有模板方法模式的)
当然啦,我相信看到这里的朋友一定是对Spring非常熟悉,很是了解的了,所以在这里为了讲述的通俗易懂,并不直接讲解Spring的源码;但是我们会模拟Spring中beanfactory的使用过程。
嘿嘿,废话不多说,咱们立马开始!
普通代码实现beanfactory:
public static class MyBeanFactory {
public Object getBean() {
Object bean = new Object();
System.out.println("构造 " + bean);
System.out.println("依赖注入 " + bean); // @Autowired, @Resource
System.out.println("初始化 " + bean);
return bean;
}
}
可以看到上述代码的扩展性是非常差的,假如我们需要在依赖注入阶段加一些后处理器,或者初始化前做一些修改的话,那就必须要改变上述代码中的getBean()方法了。
这显然是不符合咱们的“开放-封闭原则”的(对扩展开发,对更改封闭)
那接下来,咱们使用模板方法模式来对上述代码进行改造,再来看看效果:
使用模板方法模式模拟beanfactory:
public static class MyBeanFactory {
public Object getBean() {
Object bean = new Object();
System.out.println("构造 " + bean);
System.out.println("依赖注入 " + bean); // @Autowired, @Resource
for (BeanPostProcessor processor : processors) {
processor.inject(bean);
}
System.out.println("初始化 " + bean);
return bean;
}
private List<BeanPostProcessor> processors = new ArrayList<>();
public void addBeanPostProcessor(BeanPostProcessor processor) {
processors.add(processor);
}
}
/**
* 变化或者扩展的功能抽象成一个接口
*/
public static interface BeanPostProcessor {
public void inject(Object bean); // 对依赖注入阶段的扩展
}
可以看到,在使用了模板方法模式之后,代码的扩展性那是明显提高了;假如我们需要对依赖注入阶段进行扩展,那么我们只需要改变BeanPostProcessor接口即可,它会自动应用到getBean()方法中。
下面我们再从类图的角度来看看模板方法模式的实现:
总结
这次我们从定义,到使用场景,再到具体的例子来讲述模板方法设计模式,希望各位来学习、复习的朋友都能有一定的收获。另外,Spring中对设计模式的应用真的是出神入化,不愧是非常优秀的框架。