设计模式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 …

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

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

数字水印 | 离散余弦变换 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…

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

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

父进程等待子进程退出

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

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

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

C++: 二叉搜索树及实现

目录 一、二叉搜索树的概念 二、二叉搜索树的操作 2.1插入 2.2删除 1.有左子树&#xff0c;无右子树 2.有右子树&#xff0c;无左子树 3.有左子树和右子树 三、二叉搜索树的实现 要点 前言&#xff1a;为了学习map和set&#xff0c;需要先学二叉搜索树作为铺垫。 一、…

基于51单片机的函数发生器设计

一.硬件方案 此函数信号发生器是基于单片机AT89C51设计而成的&#xff0c;能够产生频率范围在0Hz—535Hz的锯齿波、正弦波、三角波、矩形波四种波形&#xff0c;并且能够通过液晶屏1602显示各自的波形类型以及频率数值。电路主要由51单片机最小系统DA0832模数转换模块运放模块…

AI代理的类型、优势及示例

AI 代理的类型、优势和示例 AI 代理是重塑商业动态的关键技术进步。了解这些代理的运作方式&#xff0c;发现它们的关键优势包括效率、可扩展性和成本效益。我们将探索代理的实例及它们在各领域的应用&#xff0c;为未来的人工智能趋势和对客户体验的影响铺平道路。 想象一支由…

多重继承引起的二义性问题和虚基类

多重继承容易引起的问题就是因为继承的成员同名而产生的二义性问题。 例&#xff1a;类A和类B中都有成员函数display和数据成员a,类C是类A和类B的直接派生类 情况一&#xff1a; class A {public:int a;void display(); }; class B {public:int a;void display; }; class C:…

【2024最新】软考资料大全(免费)

IT行业越来越卷&#xff0c;大家都在忙着搞证&#xff0c;你免费不搞一个&#xff1f; 不管有没有用&#xff0c;有总比没有好噻~ 【初级】&#xff0c;【中级】&#xff0c;【高级】 都有&#xff0c;而且全部免费&#xff0c;全部最新的&#xff01;真题&#xff0c;论文都…

眼底项目经验

眼底项目经验 可解释性不足问题眼底项目有多牛逼可解释性不足解法数据、算力、算法都免费送不仅预测当下&#xff0c;还能预测未来和慢病管理整合&#xff0c;形成一个实时健康检测生态 可解释性不足问题 今天下午和腾讯眼底项目人员讨论, 他们不准备做全身性的多疾种, 因为深…

LINUX环境基础练习题(附带答案)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【typescript - tsc 编译后路径问题/路径别名问题】

这几天在写typescript&#xff0c;遇到个路径依赖问题&#xff0c;编写的.ts文件直接运行OK&#xff0c;但是编译成.js后&#xff0c;运行提示 Error: Cannot find module xxx&#xff0c;&#x1f4dd;记录分析和解决过程 。 问题描述 原始文件&#xff0c;有index.ts 其会引…

小白不知道怎么投稿?记住这个好方法

作为一名单位信息宣传员,我最初踏上这条道路时,满心憧憬着通过文字传递我们单位的精彩瞬间,让社会听见我们的声音。然而,理想与现实之间的距离,却在一次次邮箱投稿的石沉大海中渐渐清晰。那时的我,像所有“小白”一样,以为只要用心撰写稿件,通过电子邮件发给各大媒体,就能收获满…