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

news2024/9/19 10:07:04

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的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{
    @Override
    public void primitiveOperation1() {
        System.out.println("子类A的方法1实现");
    }

    @Override
    public void primitiveOperation2() {
        System.out.println("子类A的方法2实现");
    }
}

子类B:

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

    @Override
    public 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.coloradmin.cn/o/1702996.html

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

相关文章

Java面试八股之自旋是什么意思

Java中的自旋是什么意思 自旋是多线程编程中的一种同步机制,尤其在Java中与锁的实现密切相关。当一个线程尝试获取某个锁(如内置锁或显式锁)时,如果锁已被其他线程持有,通常的做法是将该线程置于阻塞状态,…

知识融合概述

文章目录 知识融合知识融合过程研究现状技术发展趋势 知识融合 知识融合的概念最早出现在1983年发表的文献中,并在20世纪九十年代得到研究者的广泛关注。而另一种知识融合的定义是指对来自多源的不同概念、上下文和不同表达等信息进行融合的过程认为知识融合的目标是…

02 FreeRTOS 任务

1、创建任务函数 1.1 动态内存的使用 在之前我们如果要创建一个与学生有关的任务,我们会定义: //打印50个学生的信息 char name[50][100]; int age[50]; int sex[50]; //1表示男,0表示女 int score[50]; 如果之后要对其进行修改会非常麻烦&…

java面对对象编程-多态

介绍 方法的多态 多态是在继承,重载,重写的基础上实现的 我们可以看看这个代码 package b;public class main_ {public static void main(String[] args) { // graduate granew graduate(); // gra.cry();//这个时候,子类的cry方法就重写…

[Java EE] 网络编程与通信原理(三):网络编程Socket套接字(TCP协议)

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

第36届世界超级小姐大赛安徽赛区正式启动

5月26日,在现场几百位出席仪式的社会名流、时尚界大咖、文化旅游机构负责人和前沿品牌代表以及现场嘉宾的共同见证下,第36届世界超级小姐大赛安徽赛区活动的神秘面纱终于在安徽黄山悠悠湖文化中心正式揭开。伴随着高亢激情的现代音乐,长发飘逸、身形灵动…

“AURORA-M:首个遵循人类审查安全指令微调的开源多语言模型

在人工智能领域,多模态学习是一个日益增长的研究领域,它涉及将来自不同源(如图像、文本、音频等)的信息结合起来。但高昂的训练计算成本限制了模型的普及性,使得小型机构和个人难以负担。而且现有模型在多语言能力上受…

结算协同,打通企业上下游业、财、票、资

市场变革,转型当先 随着电子发票的普及与数字化浪潮的涌动,企业正面临着前所未有的转型挑战。如何在快速变化的市场中站稳脚跟,提升竞争力?答案在于数字化转型,特别是供应链结算流程的革新。 无纸化、自动化&#xff0…

数字孪生为什么这么火?水务离不开它的原因又是什么?

数字孪生利用可视化技术结合视频融合、BIM、5G、物联网、云计算和大数据等先进技术,围绕实现水质达标、安全生产、高效节能等生产、运营和管理目标。它构建了一个三维场景,涵盖自来水厂区的建筑、生产设备、管线等设施,以实现对水厂实时运行信…

分享目前堪称最好用的车机桌面app,支持画中画模式!

好用的车机桌面了,支持悬浮画中画! 如果你想改变单调的车机桌面,那么这篇文章你不要错过了!支持地图悬浮、画中画的车机桌面,不要错过! 今天阿星给大家分享3款好用、好看的大屏桌面软件,重要的…

Python数据分析常用函数

Python基础 数字处理函数 Python提供了用于数字处理的内置函数和内置模块(math),使用内置模块,需要先导入 import math。 内置函数math模块abs(-5)返回绝对值math.ceil(2.3)返回不小于x的最小整数divmod(9,4)返回商和余数math.floor(2.3)返回不大于x的…

Unity OutLine 模型外描边效果

效果展示: 下载链接

十四天学会Vue——Vue核心(理论+实战)中篇(第二天)

声明:是接着上篇讲的哦,感兴趣可以去看一看~ 这里一些代码就不写了,为了缩减代码量,大家知道就可以了: Vue.config.productionTip false //阻止 vue 在启动时生成生产提示。热身小tips,可以安装这个插件&…

记一次重定向问题(浏览器安全)解决

近期做单点登陆功能,本身应该是一个很简单的功能,却发生了意向不到的问题…让我们看下: 首先第三方给出的地址需要通过JWT框架获取token拼接后跳转,我这边为了方便首选肯定是考虑用response.sendRedirect(url),但是做好…

源代码防泄漏方案需要具备哪些因素?

首选选择加密软件对公司来说是一项关键决策,需要细致考虑多个因素。 选择合适的加密软件:关键因素与推荐方案 一、稳定性:加密软件的核心 稳定性是评估加密软件的首要因素。一个不稳定的加密软件可能导致数据损坏或系统冲突,影响…

【机器学习】机器学习在信息安全领域中的典型应用

🚀🚀🚀传送门 🔒机器学习在信息安全领域中的典型应用📕利用机器学习检测恶意行为并阻断攻击🌈使用机器学习分析移动终端安全状况⭐借助机器学习提高信息安全分析水平🎬依靠机器学习自动完成重复…

“按摩”科技?

都说A股股民是特别善于学习的,这不市场又现新概念——“按摩科技”,成立仅6年,把上门按摩干到35亿营收也是没谁了,现在号称有1000万用户,3万家入驻商户数的按摩平台,难道就凭借2.5万名女技师,活…

【YOLO 系列】基于YOLO V8的学生上课行为检测系统【python源码+Pyqt5界面+数据集+训练代码】

前言 在现代教育环境中,学生上课行为的监测对于提升教学质量和学生学习效率具有重要意义。然而,传统的人工观察方法不仅效率低下,而且难以保证客观性和准确性。为了解决这一问题,我们启动了这个项目,目的是利用YOLOV8…

【LeetCode算法】第83题:删除排序链表中的重复元素

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路:双指针法,只需遍历一遍。使用low指向前面的元素,high用于查找low后面与low不同内容的节点。将具有不同内容的节点链接在low后面,实…

make disclean V=1 分析

文章目录 make distclean步骤1:2090-2114行,执行依赖 clean步骤2:2120-2124行,执行依赖 $(mrproper-dirs)步骤3:2118-2129行,执行依赖 mrproper步骤4:2135-2142行,实现 distclean 编…