设计模式学习之模板方法模式

news2024/12/23 5:25:41

设计模式系列往期文章

  1. 设计模式学习之策略模式
  2. 设计模式学习之策略模式在前端的应用
  3. 设计模式学习之简单工厂模式
  4. 设计模式学习之工厂方法模式
  5. 设计模式学习之抽象工厂模式
  6. 设计模式学习之策略模式和简单工厂模式的对比
  7. 设计模式学习之观察者模式

模板方法模式是行为型设计模式的一种,它在基类中定义了一个执行框架(类似于pipeline),允许子类覆写该框架中的子方法,使得子类可以在不改变算法结构的情况下重写算法的特定步骤。从这个描述中就能大概理解为什么叫模板方法模式了——基类中定义的执行框架就类似于一个模板,而子类可以通过重新实现其中的方法对模板中的功能进行自定义。

在这里插入图片描述

使用场景

  1. 当多个类的算法除一些细微不同之外几乎完全一样时, 你可使用该模式。 但由于模板方法基于继承机制, 只要算法发生变化, 你就可能需要修改所有的类。
  2. 当你只希望客户端扩展某个特定算法步骤, 而不是整个算法或其结构时, 可使用模板方法模式。
  3. 模板方法模式是一个重构时经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。

说明:模板方法中的子方法可以为抽象方法,这样就需要强制实现类去实现该方法。

举个栗子

以建造房屋为例,标准房屋建造步骤是固定的,但是可以在其中的步骤中提供几个扩展点, 允许房屋业主调整房屋的部分细节。每个建造步骤 (例如打地基、 建造框架、 建造墙壁和安装水电管线等) 都能进行微调, 这使得成品房屋会略有不同。

abstract class AbstractBuilder{
    public abstract void stepOne();

    public void stepTwo() {
        System.out.println("建造框架");
    }

    public void stepThree() {
        System.out.println("建造墙壁");
    }

    public void stepFour() {
        System.out.println("安装水电管线");
    }

    public void buildTemplate() {
    	stepOne();
    	stepTwo();
    	stepThree();
    	stepFour();
    }
}

class ConcreteBuilder extends AbstractBuilder() {
    @override
    public abstract void stepOne() {
    	System.out.println("打地基");
    }
}

public static void main(String[] args) {
        AbstractBuilder builder = new ConcreteBuilder();
        builder.buildTemplate();
    }

优缺点

优点

  • 你可将重复代码提取到一个超类中。
  • 你可仅允许客户端重写一个大型算法中的特定部分, 使得算法其他部分修改对其所造成的影响减小。

缺点

  • 通过子类抑制默认步骤实现可能会导致违反里氏替换原则。
  • 模板方法中的步骤越多, 其维护工作就可能会越困难。

UML图

在这里插入图片描述

对应的plantUML类图代码:

@startuml

skinparam linetype ortho

package "Template Method" <<Frame>> {
  class BaseClassTemplate {
    + execute()
    + stepOne()
    + stepTwo()
    + stepThree()
  }

  class ConcreteImplA {
    + stepOne()
  }

  class ConcreteImplB {
    + stepOne()
    + stepTwo()
    + stepThree()
  }

  note right of BaseClassTemplate
  // execute是一个模板方法
  // 其中按照固定逻辑调用了子方法
  execute() {
    stepOne();
    stepTwo();
    stepThree();
  }
  end note

  BaseClassTemplate <|-- ConcreteImplA
  BaseClassTemplate <|-- ConcreteImplB
}
@enduml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/708872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

获取Alibaba Nacos控制台管理权限

人活着&#xff0c;就得随时准备经受磨难。他已经看过一些书&#xff0c;知道不论是普通人还是了不起的人&#xff0c;都要在自己的一生中经历许多磨难。 磨难使人坚强。 漏洞复现 访问漏洞url 输入默认账号密码&#xff1a;nacos/nacos 成功获取Alibaba Nacos控制台管理权…

全面揭秘!火山引擎边缘 IaaS 混合部署架构实践

2023年6月16日-17日 51CTO WOT全球技术创新大会在北京成功举办。在快速发展的数字化时代&#xff0c;云计算和边缘计算作为科技领域的两大核心驱动力&#xff0c;正引领着全球技术变革的潮流。为了探讨云时代基础设施在科技发展中的关键作用&#xff0c;推动边缘云行业的进一步…

【夏虫语冰】Office操作技巧汇总

文章目录 1、Word技巧1.1 添加题注 2、Visio技巧2.1 快捷键2.2 格式刷 结语 1、Word技巧 1.1 添加题注 在 Word 中添加、删除标题或设置其格式&#xff1a; 可以为图表、公式或其他对象添加题注。 题注是带编号的标签&#xff0c;可将其添加到图表、表格、公式或其他对象。 …

springboot+echarts +mysql制作数据可视化大屏(四图)

作者水平低&#xff0c;如有错误&#xff0c;恳请指正&#xff01;谢谢&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 项目简单&#xff0c;适合大学生参考 分类专栏还有其它的可视化博客哦&#xff01; 专栏地址&#xff1a;https://blog.csdn.net/qq_559…

C++类和对象——(对象的赋值拷贝构造函数)

目录 对象的赋值 目录 对象的赋值 1、提出问题&#xff1a; 2、解决办法&#xff1a; 拷贝构造函数 1、拷贝构造函数的原型&#xff1a; 2、调用机制&#xff1a; 3、使用例程代码 总代码工程&#xff1a; 对象的赋值 1、提出问题&#xff1a; 能否使用一个已经构造…

Java——《面试题——网络篇》

前文 java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java…

Java——《面试题——设计模式篇》

前文 java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java…

QThread

QThread的执行从run()函数的执行开始; 在Qt中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作&#xff0c;从而让主界面能及时响应用户的请求操作。 QThread的使用 链接 work对象 1&#xff0c;继承Qobject&#xff1b; 2&#xff0c;dowork()&#xff1b; 使…

(stm32)Unix时间戳

时间戳计时系统和常用的年月日时分秒计时系统有很大差别 时间戳&#xff1a;只计算从1970年1月1日0点整为0秒&#xff0c;只用最基本的秒来计时&#xff0c;用不进位。 常用计时系统&#xff1a;60秒进位1分钟&#xff0c;60分钟进位1小时&#xff0c;24小时进位1天&#xff…

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库

介绍 Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库&#xff0c;基于 ECMA-376&#xff0c;ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式&a…

电子器件系列44:IGBT的内部电容

对两款igbt进行比较&#xff0c;确定两者是否可以互换 A: B: 一、 从电路图上分析&#xff0c;在启动的时候&#xff0c;电路会提供一个15v的电压&#xff0c;两者都能顺利导通&#xff0c;可以替换 二、 开关时间 从实际使用电路上分析&#xff0c;这些参数对于本电路的功能…

随机数检测(二)

随机数检测&#xff08;二&#xff09;- 扑克检测、重叠子序列、游程总数、游程分布 3.4 扑克检测方法3.5 重叠子序列检测方法3.6 游程总数检测3.7 游程分布检测 3.4 扑克检测方法 扑克检测方法如下图。 以下实现代码供参考。 def alterOffsetBit(m, offset, listSub:list)…

HoloLens2与Unity的Socket通信踩坑日记

最近想让Hololens中获取电脑中更新的数据&#xff0c;打算使用套接字的方式进行通信&#xff0c;明明在unity中模拟测试可以进行正常通信&#xff0c;但是将软件部署到HoloLens上通信总是失败&#xff0c;找了很久的原因&#xff0c;找了很久的原因&#xff0c;终于能够正常通信…

国产自研开源大数据管理平台DataSophon

【背景】 几天在朋友圈看到开源社区Datavane发布了一个新开源项目DataSophon&#xff1b;一个致力于快速实现部署、管理、监控以及自动化运维大数据云原生平台&#xff0c;帮助快速构建起稳定、高效、可弹性伸缩的大数据云原生平台&#xff1b;从介绍内容来看非常优秀&#xff…

事务管理-@TransActional

事务 概念&#xff1a;一组操作集合&#xff0c;是一个不可分割的单位&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败 事务操作 开启事务&#xff08;一组操作开始前&#xff0c;开启事务&#xff09;&#xff1a;start transaction / begin;提交事务(操作全部成…

AutoSAR系列讲解(入门篇)4.8-BSW的OS功能

一、OS架构和术语解释 OS&#xff1a; 操作系统。就仅仅位于系统服务层&#xff0c;由于OS是需要直接操作硬件的一些功能的&#xff0c;所以系统服务层才会贯穿三层结构至达硬件。AutoSAR OS是基于OSEK OS开发出来的&#xff0c;OSEK也是早期ECU上的OS标准了&#xff0c;现在也…

matplotlib 区域填充

import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 8 * np.pi, 1000) siny np.sin(x) cosy np.cos(x / 2) / 2 plt.plot(x, siny, cskyblue, labelsin-X) plt.plot(x, cosy, corangered, label1/2 cos 1/2x )# 填充颜色 plt.fill_between(x, cosy, siny,…

TiDB 多租户方案和原理

作者&#xff1a; li_zhenhuan 原文来源&#xff1a; https://tidb.net/blog/a55c1d14 使用多租户 有很多文章介绍技术上如何使用多租户&#xff0c;在这里简单说明&#xff1a; CREATE RESOURCE GROUP rg_oltp RU_PER_SEC4000; ALTER USER app1 RESOURCE GROUP "r…

java——Collection、Map 深度理解

Collection <类型>&#x1f349; List(Conllection的实现类) 可以重复&#xff0c;有顺序 可存放多个null值&#x1f95d; ArrayList 主选 &#x1f353; 结构&#xff1a;数组 特点&#xff1a;查找快&#xff0c;增删慢 线程不安全&#xff0c;效率高 Vector&#…

第十三章 原理篇:SWIN-transformer

累了&#xff0c;没写完 面试完了再来写 参考教程&#xff1a; swin-transformer/model.py 文章目录 概述transformer blockswindow_partionW-MSAwindow-reversePatch Merging 概述 在前面介绍了vision transformer的原理&#xff0c;加入transformer的结构后&#xff0c;这种…