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

模式定义

模板方法模式(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.mfbz.cn/a/585258.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AQS共享模式之CyclicBarrier

概念:CyclicBarrier翻译为循环(屏障/栅栏),当一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续工作。 设计目的:和Co…

当你老了:献给40岁以上还在求职的朋友

怪盗团团长按:本文作者是我的一位老朋友,他已经年过四十,在国内职场,算是不折不扣的中老年人了。难能可贵的是,最近他还换了工作,去了一个自己不熟悉的新行业奋斗。 我一直很纳闷,为何在中国&am…

该安装包不适配当前高性能处理器 请使用 64 位安装包

今天一台用户的一台手机报错,如下: 该安装包不适配当前高性能处理器 请使用 64 位安装包 查了下,网上也有人反馈该问题 https://ask.dcloud.net.cn/question/186865 最后在贴吧上发现答案:https://tieba.baidu.com/p/8773132859 …

Bluetooth Profile 蓝牙协议栈总结

GAP-Generic Access Profile 控制设备广播和连接 GAP profile 的目的是描述: Profile rolesDiscoverability modes and proceduresConnection modes and proceduresSecurity modes and procedures 设备连接过程 LE中GAP有4种角色:BroadcasterObserv…

使用groovy+spock优雅的进行单测

使用groovyspock优雅的进行单测 1. groovyspock示例1.1 简单示例1.2 增加where块的示例1.3 实际应用的示例 2. 单测相关问题2.1 与SpringBoot融合2.2 单测数据与测试数据隔离2.3 SQL自动转换(MySQL -> H2) 参考 Groovy是一种基于JVM的动态语言&#x…

LVGL自定义滑动

触摸和编码器都可以操作 typedef struct {lv_obj_t* obj;int16_t x;int16_t y;int16_t width;int16_t height; }pos_and_size_t;typedef struct {lv_obj_t* obj;lv_coord_t height;lv_coord_t width;lv_coord_t width_pad;lv_coord_t height_pad;lv_coord_t child_widget;lv_co…

2024王炸组合!基于Mamba的遥感图像处理引爆顶会!

对比传统方法,基于Mamba的遥感图像处理在计算效率和分析精度方面遥遥领先,Mamba遥感也成为了论文研究的新方向。 具体来说,在融合高分辨率的空间图像和低分辨率的光谱图像获取综合信息方面,Mamba可以提升性能,同时保持…

【Harmony3.1/4.0】笔记七-选项卡布局

概念 当页面信息较多时,为了让用户能够聚焦于当前显示的内容,需要对页面内容进行分类,提高页面空间利用率。Tabs组件可以在一个页面内快速实现视图内容的切换,一方面提升查找信息的效率,另一方面精简用户单次获取到的…

MySQL CRUD操作

前言👀~ 上一章我们介绍了数据库的一些基础操作,关于如何去创建一个数据库,还有使用数据库,删 除数据库以及对表进行的一些基础操作,今天我们学习CRUD操作 俗称(增删改查) 如果各位对文章的内…

Objenesis 底层

Objenesis 简介 Objenesis 是一个 Java 库,用于在不调用构造方法的情况下创建对象。由于绕过了构造方法,所以无法调用构造方法中的初始化逻辑。相应的,Objenesis 无法创建抽象类、枚举、接口的实例对象。 起源 与其称之为起源,…

基于ST的STM32F407ZGT6嵌入式uCOS-III V3.08 操作系统工程实验

1.基于的开发板 2.原理图截图: 3.主控芯片框图与性能特点: High-performance foundation line, Arm Cortex-M4 core with DSP and FPU, 1 Mbyte of Flash memory, 168 MHz CPU, ART Accelerator, Ethernet, FSMC The STM32F405xx and STM32F407xx family is based on the high…

多家企业机密数据遭Lockbit3.0窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件87起,与上周相比勒索事件大幅下降。美国依旧为受勒索攻击最严重的国家,占比45%。 本周Cactus是影响最严重的勒索家族,Lockbit3.0和Bianlian恶意家族紧随其后,从整体上看Lockbit3.0依旧…

Meltdown 以及Linux KPTI技术简介

文章目录 前言一、Introduction二、 Background2.1 Out-of-order execution2.2 Address Spaces2.3 Cache Attacks 三、A Toy Example四、Building Blocks of the Attack4.1 Executing Transient Instructions4.2 Building a Covert Channel 五、Meltdown5.1 Attack Description…

深度学习之视觉特征提取器——LeNet

LeNet 引入 LeNet是是由深度学习巨头Yann LeCun在1998年提出,可以算作多层卷积网络在图像识别领域的首次成功应用。我们现在通常说的LeNet是指LeNet-5,最早的LeNet-1在1988年即开始研究,前后持续十年之久。但是,受限于当时计算机…

c++初阶——类和对象(下)

大家好,我是小锋,今天我们来学习我们类和对象的最后一个章节,我们本期的内容主要是类和对象的一些细节进行讲解 再谈构造函数 我们在初始化时有两种方式一种是函数体内初始化,一种是初始化列表 我们先来看看日期类的初始化 构造…

[机缘参悟-166] :周期论:万物的周期现象是这个世界有序性和稳定性保障;超越周期:在轮回中,把握周期节奏。

目录 前言:超越周期 一、周期是大自然和宇宙的规律,是天道 1.1 概述 1.2 万物的周期规律的现象 1.3 电磁波的周期 二、计算机世界中的周期性 三、佛家的生命轮回规律 四、人类社会发展的周期规律 五、经济活动的周期规律 5.1 概述 5.2 股市的…

Ieetcode——21.合并两个有序链表

21. 合并两个有序链表 - 力扣(LeetCode) 合并两个有序链表我们的思路是创建一个新链表,然后遍历已知的两个有序链表,并比较其节点的val值,将小的尾插到新链表中,然后继续遍历,直到将该两个链表…

C语言实验-函数与模块化程序设计

一: 编写函数fun,其功能是:输入一个正整数,将其每一位上为偶数的数取出重新构成一个新数并输出。主函数负责输入输出,如输入87653142,则输出8642。(main函数->fun函数) #define _…

【代码问题】【Pytorch】训练模型时Loss为NaN或INF

解决方法或者问题排查: 加归一化层: 我的问题是我新增的一个模块与原来的模块得到的张量相加,原张量是归一化后的,我的没有: class Module(nn.Module):def __init__(self,dim,):super().__init__()# 新增一个LayerNo…

节假日如何快速回应客户消息?

在宝贵的休闲时光或者特殊的节日期间,有时候由于工作、家庭等原因,我们很难及时回应客户的消息。那么如何在忙碌之时,如何确保与他人的交流畅通无阻呢?答案就是使用微信私域流量管理系统。 01 机器人自动回复设置 机器人自动回…
最新文章