设计模式17——模板方法模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

模板方法模式(Template Method)

是一种行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、适用场景:

1.3、主要角色:

1.4、描述对象之间关系的UML图:

二、模板代码示例

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:


一、概述

1、定义一个操纵中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变一个算法的结构下,重新定义该算法的某些特定步骤。
2、当需要完成的某一系列功能之间的步骤大体都是一致的,但在个别更详细的地方有区别,那么我们可以考虑使用模板方法模式来处理。
3、继承的意义之一:要让父类成为子类的模板,所有重复的代码都应该上升到父类中去,而不是让每个子类去重复。
4、把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。
5、提供一个代码复用平台。
6、帮助子类摆脱重复的不变行为的纠缠。

1.1、直观的理解

这时肯定会有小伙伴说这个和享元模式好像啊!那么就再从另外一个角度看:

方法0,就是从它们的公共部分的提取出来的。

可以发现,我们还可以提取出抽象的步骤。这样就可以让不一样的步骤被子类去实现,从而一方面能更充分使用公共部分,另一方面也限制了子类的步骤数量和执行顺序。

1.2、适用场景:

  • 一次性实现一个算法的不变部分,并将可变的行为留给子类
  • 各子类中公共的行为应该被提出来集中到一个公共的父类中以避免代码重复
  • 控制子类的扩展

1.3、主要角色:

  • 超类:公共的、或者说是重复的、不变的部分
  • 子类:独立的、变化的部分

1.4、描述对象之间关系的UML图:

二、模板代码示例

和上面1.1节的第二张图的例子类似,假设有两个对象的内部步骤大都一样。其中templateMethod是共享的模板方法,例子上述以分析过,就不再赘述,你可以把这当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:

超类抽象类:

abstract class AbstractClass {public void templateMethod() {//共享的代码//......System.out.println("共享的步骤");//个别步骤调用子类特有的方法来完成整个步骤this.primitiveOperation1();this.primitiveOperation2();}public abstract void primitiveOperation1();public abstract void primitiveOperation2();
}

子类A:

public class ConcreteClassA extends AbstractClass{@Overridepublic void primitiveOperation1() {System.out.println("子类A的方法1实现");}@Overridepublic void primitiveOperation2() {System.out.println("子类A的方法2实现");}
}

子类B:

public class ConcreteClassB extends AbstractClass {@Overridepublic void primitiveOperation1() {System.out.println("子类B的方法1实现");}@Overridepublic void primitiveOperation2() {System.out.println("子类B的方法2实现");}
}

主程序(发起请求的类):

public class Main {public static void main(String[] args) {AbstractClass classA = new ConcreteClassA();classA.templateMethod();AbstractClass classB = new ConcreteClassB();classB.templateMethod();}
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

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

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

相关文章

阿里云Linux 3.2104 LTS 64位安装SVN服务器

直接按步骤 yum install subversion 写y就行 主要是看看安装了那些文件 rpm -ql subversion 主要是为了创建版本库而准备,这个能一遍创建就一遍创建,不行就逐个创建。能创就忽略下面两个mkdir步骤。 mkdir /home/svn/groupRepos 根据新建目录作为版本…

LeetCode第131场双周赛C++题解

3158.求出出现两次数字的XOR值 给你一个数组 nums ,数组中的数字 要么 出现一次,要么 出现两次。 请你返回数组中所有出现两次数字的按位 XOR 值,如果没有数字出现过两次,返回 0 。 示例 1: 输入:nums …

程序中的网络地址等敏感信息,从网络安全的角度,应该怎么配置

从网络安全的角度来看,配置IP信息需要谨慎处理,以防止敏感信息泄露和系统受到攻击。以下是一些建议和最佳实践: 1. 使用环境变量或配置管理工具 环境变量 将IP地址等敏感信息存储在环境变量中,而不是硬编码在代码里。这有助于确…

业务实战————Uibot6.0 .1多页面商品信息抓取RPA机器人

前言 【案例描述】 鲜果记水果店计划在淘宝电商平台上开设一家新店,小微是该企业运营部分的运营专员,主要负责公司商品上架和管理的工作。 公司计划在开店的新品促销活动中增加水果品类红富士苹果。小微需在商品上架前了解目前平台中销量前列的红富士苹…

C#面:死锁的必要条件是什么?怎么克服?

C#中的死锁是指两个或多个线程互相等待对方释放资源,导致程序无法继续执行的情况。 死锁的必要条件: 互斥条件:至少有一个资源被设置为只能被一个线程占用。请求与保持条件:一个线程在持有资源的同时又请求其他线程占有的资源。…

SpringBootTest测试框架一

为了方便开发,对数据进行mock处理,形成文件,只修改文件内容达到mock指定数据的目的 1、定义测试模式 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface TestModel {TestModelEnum value() default TestModelEnum.LOCAL_PRIOR;String…

数字水印 | 离散余弦变换 DCT 基本原理及 Python 代码实现

目录 1 基本原理2 代码实现3 图像压缩 1 基本原理 参考博客:https://www.cnblogs.com/zxporz/p/16072580.html D C T \mathsf{DCT} DCT 全称为 D i s c r e t e C o s i n e T r a n s f o r m \mathsf{Discrete\ Cosine\ Transform} Discrete Cosine Transfo…

新购入的读码器该如何测试呢?

物联网技术的飞速发展,条码二维码作为一种高效、便捷的数据传输方式,已经广泛应用于仓储、物流配送、零售与结算、MES系统等生活和工业领域。新购的条码二维码读码器,在使用前要了解它的使用方法和性能,以确保其性能稳定、读取准确…

小预算大效果:揭秘品牌如何用创新方法实现低成本传播

说到品牌,我们都知道,没钱是真的难搞。 品牌建设就像跑马拉松,得慢慢来,持续投入,一点一滴积累声誉,这样才能培养出忠实的粉丝团。 但别急,就算资金紧张,我们也有办法让品牌慢慢站…

基于飞书机器人跨账号消息提醒

事情的起因是飞书中不同的账号不能同时登录,虽然可以在飞书的账号切换页面看到其他账号下是否有消息提醒(小红点),但是无法实现提醒功能,很不优雅,因此本文尝试提出一种新的方式实现不同账号之间的提醒功能…

自定义CSS属性(@property)解决自定义CSS变量无法实现过渡效果的问题

且看下面的代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>demot</title&g…

云原生架构产生背景

1.云原生的概念 “云原生”来自于Cloud Native的直译&#xff0c;拆开来看&#xff0c;Cloud就是指其应用软件是在云端而非传统的数据中心。Naive代表应用软件从一开始就是基于云环境、专门为云端特性而设计&#xff0c;可充分利用和发挥云平台的弹性分布式优势&#xff0c;最…

内存泄漏案例分享2-Fragment的内存泄漏

案例2——hprof文件显示出Fragment内存泄漏 接下来我们来看fragment内存泄漏&#xff0c;老规矩查看fields和references&#xff0c;确保它符合内存泄漏的情形&#xff1b;我们点击jump to source查看泄漏的位置 Fragment#MZBannerView#内部类Runnbale /*** Banner 切换时间间…

【Unity AR开发插件】如何快速地开发可热更的AR应用

预告 本专栏将介绍如何使用这个支持热更的AR开发插件&#xff0c;快速地开发AR应用。 Unity AR开发插件使用教程 更新 二、使用插件一键安装HybridCLR和ARCore 三、配置带HybridCLR的ARCore开发环境 四、制作热更数据-AR图片识别场景

StringBufferInputStream类,你学会了吗?

在Java编程中,处理字符串数据流是一项常见的任务。 为了更灵活地处理字符串数据流,Java提供了StringBufferInputStream类,它允许将字符串转换为输入流,从而可以像处理其他输入流一样对字符串进行操作。 本文将深入探讨StringBufferInputStream类的背景、用法、优缺点以及…

RocketMQ如何保证消息不丢失

同步发送消息&#xff0c;那为什么还会有异步&#xff0c;因为异步发送效率高。 存储消息 通过配置持久化策略。 存储消息的过程&#xff0c;先存到内存page cache&#xff0c;再持久化到磁盘&#xff0c;默认配置是直接到内存后就返回成功了,但是如果这时候机器断电了,就会丢…

父进程等待子进程退出

一、 为什么要等待子进程退出&#xff1f; 等待子进程退出是为了确保父进程能够在子进程执行完毕后继续执行或者处理子进程的结果。在许多情况下&#xff0c;父进程需要等待子进程完成后才能继续执行&#xff0c;以确保正确的执行顺序和结果。 以下是一些等待子进程退出的主要…

2024年,游戏行业还值得进入吗?

来自知乎问题“2024年&#xff0c;游戏行业还值得进入吗&#xff1f;”的回答。 ——原问题描述&#xff1a;从超小厂执行策划做起&#xff0c;未来有前途吗&#xff1f; 展望2024年&#xff0c;国内外的游戏市场环境或将变得更加复杂&#xff0c;曾经那个水大鱼大的时代过去了…

工智能在脉搏分析中的matlab应用

人工智能&#xff08;AI&#xff09;在脉搏分析中的应用可以通过多种方法实现&#xff0c;包括使用机器学习算法对脉搏信号进行分类、预测或异常检测。MATLAB是一个强大的平台&#xff0c;它提供了各种工具和功能来处理和分析这样的信号。以下是一个简化的步骤&#xff0c;说明…

RocketMQ如何保证顺序消费

为什么会有顺序消费的需求&#xff1f; 业务场景需要&#xff0c;比如一个订单的流程&#xff0c;从创建到支付到发货到评价&#xff0c;需要按照顺序进行。 有可能会有网络波动。 topic可能分为多个queue&#xff0c;那queue的分配是随机的&#xff0c;不同queue之间的消费速…