【设计模式】我终于读懂了模板方法模式。。。

?豆浆制作问题

编写制作豆浆的程序,说明如下:
1.制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎
2)通过添加不同的配料,可以制作出不同口味的豆浆
3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的

?模板方法模式基本介绍

  1. 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
  2. 简单说,模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
  3. 这种类型的设计模式属于行为型模式

?模板方法模式原理类图

在这里插入图片描述

?代码实现

抽象类,表示豆浆

在这里插入图片描述

花生豆浆

在这里插入图片描述

红豆豆浆

在这里插入图片描述

他们就是addCondiments方法不同,所以需要各自实现

客户端调用

在这里插入图片描述

其他方法是一样的

在这里插入图片描述

?模板方法模式的钩子方法

  1. 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。
  2. 还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造

父类多了两个细节

在这里插入图片描述

新类(纯豆浆)实现两个方法,一个空实现,一个返回false

在这里插入图片描述

红豆豆浆不变

在这里插入图片描述

这样调用就不会调用新类里面的addCondiments方法

在这里插入图片描述

?模板方法模式在Spring 框架应用的源码分析

  1. Spring IOC 容器初始化时运用到的模板方法模式
  2. 针对源码的类图(说明层次关系)
    在这里插入图片描述

ConfigurableApplicationContext类

在这里插入图片描述

refresh方法

在这里插入图片描述

子类

在这里插入图片描述

看这个方法

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

子类实现方法

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

所以这两个方法是抽象方法

看这个方法

在这里插入图片描述

空实现

在这里插入图片描述

这个也是空实现

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

所以对应了我们上面的钩子方法

?模板方法模式的注意事项和细节

  1. 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
  2. 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
  3. 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。
  4. 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
  5. 一般模板方法都加上 final 关键字, 防止子类重写模板方法.
  6. 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通常考虑用模板方法模式来处理

资料参考:https://www.bilibili.com/video/BV1G4411c7N4

代码地址:https://gitee.com/WangFuGui-Ma/design-pattern/tree/master/design