模板方法模式-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

posted @ 2017-05-27 14:12  静水楼台/Java部落阁  阅读(272)  评论(0编辑  收藏  举报