模板方法模式是一种行为型设计模式,具体定义网络上很多资源搜到本文不赘述。

  如果字面理解比较抽象的话,那以生活中简单的行为为例:天热了,到了晚上妈妈都要将今天没有吃完的饭菜放入冰箱。将饭菜放入冰箱就是一个典型的模板设计:1、将冰箱门打开;2将饭菜放入冰箱;3、关闭冰箱。类推,任何需要放入冰箱的事物都需按如上的顺序进行操作,比如西瓜、面膜等。

  敲重点:不变的是顺序;变化的可以是放入冰箱的事物,也可以是开闭冰箱、放入冰箱使用的工具不同(之前用手,后来用脚~~举例而已)

  在软件设计的应用中怎么体现呢?上该设计模式的UML图,如下(借图改进):

    

  这里设计模板方法设计模式结构的一些具体术语:

    (1) 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下:

      ① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。

      ② 基本方法:是整个算法中的一个步骤,包含以下几种类型:
        抽象方法:在抽象类中申明,由具体子类实现。
        具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
        钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。

    (2) 具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。

  对于钩子方法的存在可能不太理解。模板方法模式中模板方法定义了行为的顺序,也就是程序的执行流程。在实际生产业务需求中这个执行流程应该是可干预的,怎么解决呢?那就需要通过钩子方法使得控制行为流程更加灵活。比如上面UML图中的钩子方法isSleep()。

  Spring容器中Bean的实例化注入就使用了模板方法模式,具体体现为模板方法:refresh()。具体分析如下:

  模板方法模式,那么首先找到模板方法。先上两张UML图:

    

    

  两图简化合并后,如下:

    

  上图与模板方法模式结构类似,那么类似就是模板方法设计模式么?得有模板方法才是。那看能不能找到模板方法:跟踪调试如下代码

    

  调用构造函数如下,整个识别、实例化、注入bean的工作均完成:

    

  继续跟踪发现,refresh()就是模板方法:提取方法中注释截图如下

    

  为什么refresh要按这个流程执行,可以通过其父类接口ConfigurableApplicationContext该方法声明的注释得到答案:

    

  refresh中的方法均为protected,在其子类中这些方法本身没有显示的改变,但是方法内调用的方法却在子类中有变化。以refreshBeanFactory()为例,在模板方法的第二部obtainFreshBeanFactory()中用到了,但是注解配置版与XML配置版获取的行为方式就是差别处理的,通过跟踪调试验证,如下图:

  注解配置版:

    

    

  XML配置版:

    

    

  注意以上两个具体方法前都是用了关键字 final。

  

五、模板方法设计模式及在Spring中的应用的更多相关文章

  1. spring 中常用的设计模式

    一. Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模 ...

  2. Spring 中使用了那些设计模式呢?

    一. Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模 ...

  3. 关于spring中bean配置的几件小事

    一.IOC和DI 1.IOC(Inversion of Control) 其思想是反转资源获取的方向.传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源:而应用了IOC之后 ...

  4. spring 中的设计模式

    https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485205&idx=1&sn=63455d2313776d ...

  5. 详解设计模式在Spring中的应用

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,在IT学习者网站就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了其设 ...

  6. Spring中的用到的设计模式大全

    spring中常用的设计模式达到九种,我们举例说明: 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式的实质是由一 ...

  7. 详解设计模式在Spring中的应用---转载

    Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话不多说,开始今天的内容. spring中常用的设计模式达到九种,我们一一举例: 第一种:简单工厂 又叫 ...

  8. Spring中应用的那些设计模式

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,我们就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了其设计的思想理念 ...

  9. 设计模式在 Spring 中的应用

    Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话不多说,开始今天的内容. spring中常用的设计模式达到九种,我们一一举例: 第一种:简单工厂 又叫 ...

随机推荐

  1. Antd使用timePicker封装时间范围选择器(React hook版)

    antd中提供了是日期范围选择器及datepaicker封装日期范围选择器的示例,但是没有时间选择范围的组件,这里使用两个timePicker组合一个事件范围选择器,通过disabled属性限定时间可 ...

  2. 基于 Keras 实现图像风格转移

     Style Transfer 这个方向火起来是从2015年Gatys发表的Paper A Neural Algorithm of Artistic Style(神经风格迁移) , 这里就简单提一下论 ...

  3. Flink 非对齐Unaligned的checkpoint(源码分析)

    本文源码基于flink1.14 在帮助用户排查任务的时候,经常会发现部分task处理的慢,在Exactly once语义时需要等待快照的对齐而白白柱塞的情况 在flink1.11版本引入了非对齐的ch ...

  4. Redis之持久化方式详解

    背景:Redis之所以能够在技术革新发展迅速的时代超越Memcache等其他Nosql数据库,最主要的一点是Redis提供数据持久化,能够根据持久化策略将缓存数据灵活的写到磁盘上,更好地满足了当下海量 ...

  5. Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  6. Pod:Kubernetes最小执行单元

    Pod基本概念理解 Pod是什么 Pod 是 Kubernetes 应用程序的基本执行单元,它是 Kubernetes 对象模型中创建或部署的最小和最简单的单元. 一个Pod可以包括一个或者多个容器. ...

  7. 5.13-jsp分页功能实现

    1.分页共能的实现 可以在dao层中创建方法 List<Member> pager(Long pageSize, Long pageNum);(方法灵活运用)其中传入的两个参数pageSi ...

  8. Django 优化杂谈

    Django 优化杂谈 Apr 21 2017 总结下最近看过的一些文章,然后想到的一些优化点,整理一下. 数据库连接池 http://mt.dbanotes.net/arch/instagram.h ...

  9. golang中自定义实现0当做除数的错误异常处理接口

    package main import "fmt" type ZeroDivisor struct { // 定义一个0当做除数的结构体 divisor int // 被除数 di ...

  10. web.xml最新配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmln ...