模板方法模式-Template Method
一、定义
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
二、类图
三、示例
现在我们自己来写个demo并应用上模板方法模式。
借用网上的例子。把大象装进冰箱分三步:1、把冰箱门打开; 2、把大象装进去; 3、把冰箱门关上。
public abstract class AbstractOperator { public void putElephant() { //1、把冰箱门打开 open(); //2、把大象装进去 put(); //3、把冰箱门关上 close(); } private void open() { System.out.println("把冰箱门打开"); } protected abstract void put(); private void close() { System.out.println("把冰箱门关上"); } } public class ElephantOperator1 extends AbstractOperator { @Override protected void put() { System.out.println("用手直接把大象放进冰箱"); } } public class ElephantOperator2 extends AbstractOperator { @Override protected void put() { System.out.println("用托盘托着把大象放进冰箱"); } }
四、Spring中的模板方法模式
在我们使用的框架中,很多地方都用到了模板方法模式。毕竟框架要对用户是可扩展的,所以会封装了一些模板方法,然后部分具体的实现交由子类完成。
我们常用的SpringMVC中,其核心控制器DispatcherServlet就用到了模板方法模式。
FrameworkServlet { //初始化SpringMVC容器 protected WebApplicationContext initWebApplicationContext() { …… if (!this.refreshEventReceived) { onRefresh(wac); } …… } //模板方法,由子类来实现 protected void onRefresh(ApplicationContext context) { // For subclasses: do nothing by default. } } //SpringMVC中的核心控制器 public class DispatcherServlet extends FrameworkServlet{ @Override protected void onRefresh(ApplicationContext context) { initStrategies(context); } }
DispatcherServlet的父类FrameworkServlet中定义了SpringMVC容器初始化用到的initWebApplicationContext()方法,该方法需要调用onReresh()进行刷新操作,但我们看到onRefresh方法被声明为抽象的,并可以看到框架开发者给出的注释,意思是该方法默认不会实现任何逻辑,只是为子类预留的。而在子类DispatcherServlet中实现了具体的逻辑,即初始化策略(初始化DispatcherServlet用到的一些基本组件,如HandlerMapping,HandlerAdapter,异常解析,视图解析器等)。也就是说FrameworkServlet并不知道继承它的子类要完成什么样的onRefresh操作,所以并不实现逻辑,只能将其声明为abstract,待其子类根据实际需求进行相应的onRefresh操作。
……更多设计模式的内容,可以访问Refactoring.Guru
不积跬步,无以至千里。不积小流,无以成江海!