设计模式(三)、模板方法设计模式

模式定义

模板方法模式(Template Method Pattern):定义一个操作中算法的框架而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

模式结构

模板方法模式包含如下角色:
AbstractClass: 抽象类
ConcreteClass:具体子类

模式分析

  1. 是一种基于继承的代码复用技术

  2. 将一些复杂流程的实现步骤封装在一系列基本方法中

  3. 在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果

方法分类

  • 模板方法(Template Method)

  • 基本方法(Primitive Method)

    • 抽象方法(Abstract Method)

    • 具体方法(Concrete Method)

    • 钩子方法(Hook Method)

      • (1)“挂钩”方法:isXXX()或hasXXX(),返回类型为boolean类型
      • (2)空方法

                   代码示例:

//模板方法
public void template(){open();display();
//通过钩子方法来确定某一步骤是否执行
if(isPrint()){print();}
}
//钩子方法
public boolean isPrint() {return true;
}

模板方法模式的优点

  1. 在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序
  2. 提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为
  3. 可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行
  4. 更换和增加新的子类很方便,符合单一职责原则和开闭原则

模板方法模式的缺点

需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统会更加庞大,设计也更加抽象

模板方法模式使用场景 

  1. 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现
  2. 各子类中公共的行为应被提取出来,并集中到一个公共父类中,以避免代码重复
  3. 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制 

模板方法模式和继承有什么区别 

  • 模板方法设计模式更注重于算法的骨架和步骤的延迟实现,而继承则侧重于类与类之间的关系以及属性和方法的继承。
  • 模板方法设计模式是在算法层面上进行复用和扩展,而继承则是在类层面上进行复用和扩展。
  • 模板方法设计模式通常需要定义抽象类和具体实现类,而继承则是通过子类继承父类来实现。 

模板方法设计模式和策略模式的差异会放到策略模式的文章中 

因为项目架构优化,部分算法实现用到了模板方法设计模式,写了这个文章。如有错误或需要调整的地方请留言。 

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

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

相关文章

SSH远程直连服务器docker容器的jupyter

SSH远程直连服务器docker容器的jupyter 动机:最近在公司服务器使用jupyter出现了点问题,也不知道怎么回事,jupyter lab打开都没问题,但是准备打开一个ipynb文件时就卡住了,啥反应没有,ctrlC 也不能关掉jupy…

JAVA——抽象类

抽象类 Java中的抽象类是一种特殊的类,它不能被实例化,即不能直接创建对象,只能作为其他类的基类(父类)来使用。抽象类主要用于定义一些通用的属性和方法,这些方法可以在子类中得到具体的实现。 抽象类使…

通过iptables限制docker 容器的运行端口

通过在iptables DOCKER-USER 添加规则,即可实现所有外部网络都无法访问docker中的服务: iptables -I DOCKER-USER -i enp0s3 -j DROP 规则:所有从外部网络进入的数据包,直接被丢弃。 DOCKER-USER链是上述FORWARD链中第一个规则匹…

java案例-读取xml文件

需求 导入依赖 <dependencies><!-- dom4j --><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency> </dependencies>代码 SAXReader saxReade…

进迭时空宣布开源RISC-V芯片的AI核心技术

仟江水商业电讯&#xff08;4月29日 北京 委托发布&#xff09;4月29日&#xff0c;在“创芯生生不息——进迭时空2024年度产品发布会”上&#xff0c;进迭时空CEO、创始人&#xff0c;陈志坚博士宣布将开源进迭时空在自研RISC-V AI CPU上的核心技术&#xff0c;包括AI扩展指令…

无人机+集群组网+单兵图传:空地一体化组网技术详解

空地一体化组网技术是一种结合了无人机、集群自组网和单兵图传等多种技术的先进通信解决方案。这种技术方案的主要目的是在前线事故现场和后方指挥中心之间建立一个高效、稳定的通信链路&#xff0c;以确保信息的实时传输和指挥的顺畅进行。 首先&#xff0c;前端视频采集部分&…

自适应信号处理基础及应用——DSP学习笔记五

本专栏的图片内容都来自于老师讲课的PPT&#xff0c;本篇博客只是我个人对于上课内容的知识结构分析和梳理。 导论 自适应系统的定义、特征、形式、举例 特征 非自适应系统 • 固定参数的设计方法 • 假定事先知道了一切可能的输入条件&#xff1b;在这些条件下怎样动作&#…

word 表格 文字 上下居中

问题 word 表格 文字 上下居中 详细问题 笔者进行word 文档编辑&#xff0c;对于表格中的文本内容&#xff0c;如何进行上下居中&#xff1f; 解决方案 步骤1、选中需要进行操作的单元格 步骤2、右键 → \rightarrow →点击表格属性 步骤3、依次点击单元格 → \rightar…

Qt绘图与图形视图之自定义图元实现拖拽、拉伸、旋转功能

往期回顾 Qt绘图与图形视图之移动鼠标手动绘制任意多边形的简单介绍-CSDN博客 Qt绘图与图形视图之场景、视图架构的简单介绍-CSDN博客 Qt绘图与图形视图之基本图元绘制的简单介绍-CSDN博客 Qt绘图与图形视图之自定义图元实现拖拽、拉伸、旋转功能 一、最终效果 实现对自定义图…

HTML中datalist的用法

在HTML中&#xff0c;<datalist>元素用于为<input>元素提供预定义的选项列表&#xff0c;供用户从中选择。通常&#xff0c;它配合<input>元素的list属性一起使用。以下是如何使用<datalist>元素的简单示例&#xff1a; <!DOCTYPE html> <h…

android studio SQLite数据库的简单使用

在Android Studio中使用数据库可以有多种方式&#xff0c;常见的几种方式包括使用SQLite数据库和使用 SQLite数据库 SQLite是一款轻量级的关系型数据库管理系统&#xff0c;在Android中被广泛使用。要在Android Studio中使用SQLite数据库&#xff0c;需要先创建一个数据库帮助…

leetcode刷题:两数之和

面试造火箭&#xff0c;工作拧螺丝&#xff0c;话虽如此&#xff0c;背背八股文&#xff0c;刷刷算法题&#xff0c;也可以提高自己的编程素养&#xff0c;一切目的是为了上岸&#xff0c;在此就不咬文嚼字&#xff0c;追求茴香豆的茴有几种写法了&#xff0c;换句话说&#xf…

vue2 通过设置devServer.port端口号,启动测试服务后端口失效/自动切换端口

vue2 设置端口号小于1990&#xff08;通过设置devServer.port&#xff09; 启动测试服务后端口失效/自动切换端口 问题描述 在配置文件vue.config.js中 module.exports {devServer: {host: localhost,port: 1890,// ...}项目创建后一直使用1890&#xff0c;能正常启动local…

官网设计UI设计需要考虑哪些?

响应式布局&#xff1a; 使用响应式设计技术&#xff0c;确保网站能够自动适应不同设备的屏幕大小和分辨率。这包括使用流式布局、弹性布局和媒体查询等技术。 移动优先&#xff1a; 采用移动优先的设计策略&#xff0c;即首先设计适用于小屏幕设备的界面&#xff0c;然后逐渐…

应用层协议了解

一 HTTP前置知识 这篇博客会有点长&#xff0c;但对我来说非常有意义&#xff0c;这是我从一无所知到理解网络的重大突破&#xff0c;在前两个月我对网络非常恐惧&#xff0c;还十分不理解什么是网络&#xff0c;什么是协议。接下来先介绍几个概念。 1 流量 我们把数据给别人&…

GitHub Desktop进行汉化

第一步下载github桌面版 官网&#xff1a;安装 GitHub Desktop - GitHub 文档 历史版本&#xff1a;https://github.cn.uptodown.com/windows/versions 本期下载版本3.3.11进行汉化&#xff0c;最新版不一定稳定。 网站打不开的可自取&#xff1a; 3.3.11版本安装包链接&a…

【论文笔记】Language Models are Few-Shot Learners B部分

Language Models are Few-Shot Learners B 部分 回顾一下第一代 GPT-1 &#xff1a; 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式&#xff1b;模型架构是基于 Transformer 的叠加解码器&#xff08;掩码自注意力机制、残差、Layernorm&#…

排序算法:插入、希尔、选择、推排、冒泡、快速、归并排序

排序算法 目录 前言 一、排序的概念 1.1排序的概念 1.2 常见的排序算法 二、常见排序算法的实现 2.1 插入排序 2.2 希尔排序 2.3 选择排序 2.4 堆排序 2.5 冒泡排序 2.6 快速排序 2.6.1 hoare版本 2.6.2 前后指针版本 2.6.3 非递归版本 2.7 归并排序 归并排序 2.8 计数排序 三、…

【mysql】mysql中的数据类型知多少?

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

RediSearch:Redis强大的搜索引擎

在现代应用程序开发中&#xff0c;高效的搜索功能是提升用户体验的关键因素之一。Redis&#xff0c;作为一款广泛使用的内存数据存储系统&#xff0c;以其高速、灵活的特点受到开发者青睐。然而&#xff0c;原生Redis并不支持复杂的数据搜索功能。为了填补这一空白&#xff0c;…