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

2023-05-16

🍎豆浆制作问题

编写制作豆浆的程序,说明如下:
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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【设计模式】我终于读懂了模板方法模式。。。 的相关文章

  • Spring源码学习之BeanDefinition源码解析

    本文作者 磊叔 GLMapper本文链接 https juejin cn post 6844903553820000269 Bean的定义主要由BeanDefinition来描述的 作为Spring中用于包装Bean的数据结构 今天就来看看
  • c++享元模式

    享元模式 1 享元模式简介 享元模式在 设计模式 可复用面向对象软件的基础 一书中是这样说的 运用共享技术有效地支持大量细粒度的对象 本质就是对大量细粒度的对象进行共享 不是每个对象都要通过new的方式去创建 而是通过区分对象的内部状态和外
  • 行为型模式-策略模式

    package per mjn pattern strategy 抽象策略类 public interface Strategy void show package per mjn pattern strategy 具体策略类 用来封装算法
  • java需会(转载)

    一 基础篇 1 1 Java基础 面向对象的特征 继承 封装和多态 final finally finalize 的区别 Exception Error 运行时异常与一般异常有何异同 请写出5种常见到的runtime exception i
  • 设计模式--组合模式

    组合模式 又叫部分整体模式 属于结构型模式 基本原理 以树形的结构将相似的对象组合起来 主要流程 1 创建对象 2 在对象中设置用来存放下一级相似对象的数据结构 3 在对象中设置增删改查等功能 注意 这种模式和数据结构中的树形结构相似 in
  • [C++]备忘录模式

    备忘录模式 Memento Pattern 保存一个对象的某个状态 以便在适当的时候恢复对象 备忘录模式属于行为型模式 github源码路径 https github com dangwei 90 Design Mode 此文件包含 mai
  • Java并发编程之设计模式

    同步模式之保护性暂停 1 定义 即 Guarded Suspension 用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程 让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线
  • 设计模式(5)-适配器模式(Adapter Pattern)

    适配器模式 Adapter Pattern 顾名思义 就像变压器 转接头差不多 就像美国的生活电压是110V 中国是220V 就需要一个变压器将220V转换成110V 或者一个Type C接口想插如USB接口的东西 你就需要一个转换器 而这
  • 设计模式学习笔记-工厂模式

    设计模式学习笔记 工厂模式 作用 实现了创建者和调用者的分离 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品 对于增加新的产品 必须要扩展已有的代码 工厂方法模式 用来生产同一等级结构中的固定产品 支持增加任意产品 抽象工厂模式
  • 单例模式的八种写法比较

    单例模式是最常用到的设计模式之一 熟悉设计模式的朋友对单例模式都不会陌生 一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式 但是除了这两种方式 本文还会介绍其他几种实现单例的方式 让我们来一起看看吧 简介 单例模式是一种常
  • Java设计模式之装饰者设计模式Decorator Pattern

    目录 一 基本概念 二 结构 1 图示 三 案例演示 被装饰对象的基类 一个接口 有cost 和description 两个抽象方法 具体被装饰的对象 实现上面这个接口 装饰者抽象类 基类 实现drink接口 具体的装饰者类 糖 具体装饰者
  • 组合型模式

    概述 对于这个图片肯定会非常熟悉 上图我们可以看做是一个文件系统 对于这样的结构我们称之为树形结构 在树形结构中可以通过调用某个方法来遍历整个树 当我们找到某个叶子节点后 就可以对叶子节点进行相关的操作 可以将这颗树理解成一个大的容器 容器
  • Java监听器与观察者模式

    Java监听器与观察者模式 Java中的监听器 Listener 和观察者模式 Observer Pattern 都是用于处理对象间的事件通知和响应的设计模式 它们的目的是在对象之间建立一种松散的耦合 使得一个对象的状态变化可以通知到其他对
  • 设计模式—迭代器模式解析

    本文参考学习了 图解设计模式 中的代码实现和原理解释 迭代器模式 简介 Iterator 模式用于在数据集合中按照顺序遍历集合 就类似于我们的循环 一个个去遍历一个集合中的所有元素 示例代码 首先我们思考一个书本和书架的关系 显然 书架可以
  • 设计模式(3)--对象结构(5)--外观

    1 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口 这个接口使得 这一子系统更加容易使用 2 两种角色 子系统 Subsystem 外观 Facade 3 优点 3 1 对客户屏蔽了子系统组件 减少了客户处
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 设计模式(三)-结构型模式(4)-组合模式

    一 为何需要组合模式 Composite 在代码设计中 有种情况是对象之间存在层次关系 即对象之间会存在父结点和子结点的关系 比如在文件管理系统中 所有文件和文件夹形成树状结构 文件夹目录里存在子文件夹和文件 文件夹属于枝结点 文件属于叶结
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • C++设计模式 --1.工厂模式和单例模式

    文章目录 1 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 2 单例模式 懒汉式 饿汉式 1 工厂模式 简单工厂模式

随机推荐

  • 【设计模式】我终于读懂了享元模式。。。

    祝大家开工大吉 x1f9e7 x1f9e7 x1f9e7 xff01 xff01 主页有红包哦 点这里 文章目录 祝大家开工大吉 x1f9e7 x1f9e7 x1f9e7 xff01 xff01 主页有红包哦 点这里 https blink
  • bus总线

    有时候两个组件也需要通信 xff08 非父子关系 xff09 当然Vue2 0提供了Vuex xff0c 但在简单的场景下 xff0c 可以使用一个空的Vue实例作为中央事件总线 eventBus js放在assets import Vue
  • 3层模式下长时间调用的进度条提示方案

    Winform 43 WCF 43 IIS 方式 任务执行时间在几分钟 xff0c 需要在客户端显示进度条 xff0c 与提示 原理 xff1a 客户端发出任务调用请求后 xff0c 服务启用一个独立线程来执行 xff0c 将执行过程与结果
  • [原]win7与linux网络共享挂载nfs配置

    网络文件系统 NFS Network File System 是一种将远程主机上的分区 目录 经网络挂载到本地的一种机制 xff0c 通过对网络文件系统的支持 xff0c 用户可以在本地系统上像操作本地分区一样来对远程主机的共享分区 目录
  • Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件(附源码)

    功能说明 输入文件路径 xff0c 在浏览器输出文件预览信息 xff0c 经测试360 极速 xff08 Chrome xff09 IE9 10 Firefox通过 分类文件及代码说明 DemoFiles 存放可测试文件 Default a
  • 不是技术也能看懂云计算,大数据,人工智能

    我今天要讲这三个话题 xff0c 一个是云计算 xff0c 一个大数据 xff0c 一个人工智能 xff0c 我为什么要讲这三个东西呢 xff1f 因为这三个东西现在非常非常的火 xff0c 它们之间好像互相有关系 xff0c 一般谈云计算
  • 那些在调试器里没问题(在开发环境没问题),但是独立运行却出问题的原因汇总...

    为什么80 的码农都做不了架构师 xff1f gt gt gt 1 静态编译的动态库依赖 xff0c 在调试器中会把程序的起始目录放在当前项目目录 xff0c 因此如果依赖库在当前项目目录则不会出问题 2 权限问题 xff0c 比如调试器可
  • Android-Parcelable理解与使用(对象序列化)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt parcel定义介绍 xff1a android提供了一种新的类型 xff1a parcel xff08 英文解释 xff1a 包裹 xff0c 小包 xff09 xff0
  • 参考ElementUI的文档实现方案,实现自己组件库的说明文档

    实现使用markdown编写的个人组件库说明文档 前一篇文章实现了按需加载封装个人的组件库功能 xff0c 有了组件库 xff0c 当然还要有配套说明文档 xff0c 这样使者用起来才更方便 打包完成的dist目录是最终可放到服务器中 xf
  • 【设计模式】我终于读懂了代理模式。。。

    文章目录 x1f466 代理模式的基本介绍 x1f467 代理模式示意图 x1f469 静态代理 x1f468 应用实例 x1f476 思路分析图解 类图 x1f475 静态代理优缺点 x1f474 动态代理 x1f471 JDK 中生成代
  • 今年读过的还不错的计算机类书籍

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 今年读过的还不错的计算机类书籍 一年又快过去了 xff0c 今年恶补了很多计算机基础知识 xff0c 参kao了网上各种程序员必读书目 xff0c 看下来觉得很有收获 1
  • <ps> ps aux 和ps -aux和 ps -ef的选择

    Linux中的ps命令是Process Status的缩写 ps命令用来列出系统中当前运行的那些进程 ps命令列出的是当前那些进程的快照 xff0c 就是执行ps命令的那个时刻的那些进程 xff0c 如果想要动态的显示进程信息 xff0c
  • python学习笔记(六):常用模块

    一 模块 包 什么是模块 xff1f 模块实质上就是一个python文件 它是用来组织代码的 xff0c 意思就是说把python代码写到里面 xff0c 文件名就是模块的名称 xff0c test py test就是模块名称 什么是包 x
  • Linux经常用到的命令

    1 Linux下用vim打开配置文件乱码 xff0c 在终端输入 xff1a LANG 61 即可 2 查看端口是否被占用 xff1a 3 netstat anp grep port netstat ltn 4 lsof i port 5
  • (部分清帐)关于收到部分还款SAP系统两种处理方法的说明和比较-转

    背景 销售货物给A顾客 同时开出发票16000元 数日后 进行收款作业 但收款金额为15000元 小于原发票金额 此时在系统中做收款 同时处理未清项 F 28收款 输入实际收款金额后进入 34 处理未清项 34 界面 可发现在右下角输入金额
  • Java获取单词的首字母的方法_java – 从句子中的每个单词中提取第一个字母

    我已经开发了一个语音到文本程序 用户可以说一个简短的句子 然后将其插入文本框 如何提取每个单词的首字母然后将其插入文本字段 xff1f 例如 如果用户说 xff1a Hello World 我想在文本框中插入HW 解决方法 如果你有一个字符
  • python学习笔记-(九)模块

    基础知识 1 定义 模块 xff1a 用来从逻辑上组织python代码 xff08 变量 xff0c 函数 xff0c 类 xff0c 逻辑 实现一个功能 xff09 xff0c 本质就是 py结尾的python文件 xff08 文件名 x
  • Ubuntu 查看磁盘空间大小命令<转>

    df h Df命令是linux系统以磁盘分区为单位查看文件系统 xff0c 可以加上参数查看磁盘剩余空间信息 xff0c 命令格式 xff1a df hl 显示格式为 xff1a 文件系统 容量 已用 可用 已用 挂载点 Filesyste
  • linux开机自动启动vnc,怎样实现重启linux后自动启动vncserver服务?

    linux开机自动启动vncserver服务 xff0c 需要先保证VNC安装无问题以及各种配置以及防火墙正常 xff0c 下面是vncserver服务安装 配置以及设置自启动的步骤 xff1a 首先需要检查一下服务器是否已经安装了VNC服
  • 【设计模式】我终于读懂了模板方法模式。。。

    x1f34e 豆浆制作问题 编写制作豆浆的程序 xff0c 说明如下 1 制作豆浆的流程 选材 gt 添加配料 gt 浸泡 gt 放到豆浆机打碎 2 通过添加不同的配料 xff0c 可以制作出不同口味的豆浆 3 选材 浸泡和放到豆浆机打碎这