zoukankan      html  css  js  c++  java
  • 模板方法模式-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

    不积跬步,无以至千里。不积小流,无以成江海!
  • 相关阅读:
    parted分区流程操作
    配置sudo命令行为审计
    sudo详细介绍
    groupadd(创建组)重要参数介绍
    useradd常用参数介绍
    /etc/default/useradd文件内容及对应功能
    linux基础正则
    centos 7.5 安装mongodb
    centos 7.5 安装mysql
    php删除制定文件及文件夹
  • 原文地址:https://www.cnblogs.com/rouqinglangzi/p/6912653.html
Copyright © 2011-2022 走看看