【图解设计模式系列】The Template Method Pattern: 模板方法模式

定义:
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

图解:
在这里插入图片描述

然后我看了看实例 这种模式实际上就是鼓励我们多用接口来尽可能的把同类东西抽象到一个,就像猫是个抽象类,什么时候我们发现一个新品种的猫 我们就实现一个继承实现这个猫接口的实体猫类,比如英短猫。

实例

借用网上的例子。把大象装进冰箱分三步: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.
    }
}

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操作。

posted @ 2020-12-28 08:35  EvanMeetTheWorld  阅读(27)  评论(0)    收藏  举报