设计模式——模板方法模式(Template Method Pattern)

news2024/12/28 20:33:09
概述

       模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。

      模板方法模式结构比较简单,其核心是抽象类和其中的模板方法的设计,其结构如下图所示:

模板方法(Template Method)模式包含以下主要角色:

  1. 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。

              模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。

              基本方法:是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:

  1. 抽象方法(Abstract Method) :一个抽象方法由抽象类声明、由其具体子类实现。
  2. 具体方法(Concrete Method) :一个具体方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。
  3. 钩子方法(Hook Method) :在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。一般钩子方法是用于判断的逻辑方法,这类方法名一般为isXxx,返回值类型为boolean类型。

       在模板方法模式中,由于面向对象的多态性,子类对象在运行时将覆盖父类对象,子类中定义的方法也将覆盖父类中定义的方法,因此程序在运行时,具体子类的基本方法将覆盖父类中定义的基本方法,子类的钩子方法也将覆盖父类的钩子方法,从而可以通过在子类中实现的钩子方法对父类方法的执行进行约束,实现子类对父类行为的反向控制。

  1. 具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的组成步骤。
简单实现
常规实现

钩子实现

由上图可以看出, HRProcess具体子类覆盖了isAudit()钩子方法,使采购流程正常执行,而MarketProcess具体子类没有覆盖钩子方法,父类模板方法中采购没有没有执行,我们可以通过钩子方法实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行。

总结

适用场景:

    一次性实现一个算法不变的部分,并将可变的行为留给子类来实现。

    各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。

优点:

    利用模板方法将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。

    将不同的代码不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性。

    把不变的行为写在父类上,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。

缺点:

    类数目的增加,每一个抽象类都需要一个子类来实现,这样导致类的个数增加。

    类数量的增加,间接地增加了系统实现的复杂度。

    继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍。

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

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

相关文章

氢气传感器报警值:守护实验室安全的隐形卫士

随着科技的发展,我们的生活变得越来越便捷,但是与此同时,安全问题也日益凸显。其中,氢气作为一种清洁能源,被广泛应用于各个领域,但是如果不加以控制,氢气泄漏也可能带来严重的安全隐患。因此&a…

成都源聚达:抖音开店卖什么最好

在数字化浪潮的推动下,抖音已成为一个集娱乐与商业于一体的平台,吸引着无数商家和创作者。但在这个竞争激烈的市场中,选择什么样的产品才能在抖音上脱颖而出呢? 自然是那些符合抖音用户喜好的产品。据统计,服饰、美妆、食品、家居…

[k8s系列]:kubernetes·概念入门

文章目录 序言1 kubernetes概述1.1 kubernetes解决的问题1.1.1 部署方式的演变1.1.2 容器化部署——容器编排问题 1.2 kubernetes组件1.2.1 kubernetes组件调用关系1.2.2 调用逻辑示例 序言 序言:本文将从,第一节:kubernetes解决的问题、组件…

Linux实验记录:使用iptables

前言: 本文是一篇关于Linux系统初学者的实验记录。 参考书籍:《Linux就该这么学》 实验环境: VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: 防火墙作为公网与内网的屏障&#…

2023年黄金市场行业分析(电商数据查询软件):年销售额激增104%,黄金消费持续走热

近日,社交平台上不少年轻人将实物金条在黄金加工店加工成黄金首饰的帖子爆火,不少人也在评论区表示要跟随。可以看到,黄金的热潮还在持续。 根据世界黄金协会《2022年中国金饰市场趋势洞察》报告显示,黄金市场被认为是销售大头的…

Flask 入门1:一个简单的 Web 程序

1. 关于 Flask Flask诞生于2010年, Armin Ronacher的一个愚人节玩笑。不过现在已经是一个用python语言基于Werkzeug工具箱编写的轻量级web开发框架,它主要面向需求简单,项目周期短的小应用。 Flask本身相当于一个内核,其他几乎所…

idea报错:Cannot resolve symbol ‘springframework‘

说明maven没有配置好或者加载好 解决: 1)File–>Invalidate Caches… 清理缓存,重启idea客户端 然后我这里只进行了第一步就不报错了!!! 如果你依然报错,就继续第二步: 2&…

实战教程:如何用Spring Boot和MySQL存储共享单车数据

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

数字孪生项目开发的注意事项

数字孪生是指使用数字化技术创建物理实体的数字副本,通常用于模拟、监测和优化实际系统的运行。数字孪生项目的开发涉及多个方面,以下是一些注意事项,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司&#…

Node.js-express

1.了解Ajax 1.1 什么是ajax Ajax的全称是Asynchronous Javascript And XML(异步Js和XML). 通俗的理解:在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式,就是Ajax 1.2 为什么要学习Ajax 之前所学的技术&#xff0c…

想查大数据信用报告,这几点高性价比查询平台的特点要了解!内附查询平台推荐

随着大数据技术的不断发展,大数据信用报告成为不少人全方位了解自身个人信用的重要工具。在众多大数据信用报告查询平台中,选择高性价比的查询平台是很多人都想了解的,本文就为大家介绍大数据信用报告查询高性价比平台的特点,希望…

如何在群晖NAS部署office服务实现多人远程协同办公编辑文档

文章目录 本教程解决的问题是:1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 本教程解决的问题是: 1.Word,PPT,Excel等重要文件存在本地环境,如何在编…

阿里云幻兽帕鲁服务器4核16G配置报价

自建幻兽帕鲁服务器租用价格表,2024阿里云推出专属幻兽帕鲁Palworld游戏优惠服务器,配置分为4核16G和4核32G服务器,4核16G配置32.25元/1个月、10M带宽66.30元/1个月、4核32G配置113.24元/1个月,4核32G配置3个月339.72元。ECS云服务…

RabbitMQ之三种队列之间的区别及如何选型

目录 不同队列之间的区别 Classic经典队列 Quorum仲裁队列 Stream流式队列 如何使用不同类型的队列​ Quorum队列 Stream队列 不同队列之间的区别 Classic经典队列 这是RabbitMQ最为经典的队列类型。在单机环境中,拥有比较高的消息可靠性。 经典队列可以选…

【Algorithms 4】算法(第4版)学习笔记 01 - 1.5 案例研究:union-find算法

文章目录 前言参考目录学习笔记1:动态连通性2:UF 实现 1:快速查找 quick-find2.1:demo 演示 12.2:demo 演示 22.3:quick-find 代码实现3:UF 实现 2:快速合并 quick-union3.1&#xf…

Powershell 并发任务 | Runspace 线程 | 结果获取

介绍 在 PowerShell 中进行多任务处理(Multithreading 或 Parallel Processing)主要目的是提高脚本的执行效率和性能。对于需要处理大量数据或执行多个独立任务的脚本来说尤其有用。 提高性能: 多任务处理允许脚本同时执行多个任务&#xff…

Centos7 双机单网卡安装 OpenStack

虚拟机配置 1:准备虚拟机2台,配置如下 openstack master----192.168.20.205 2cpu,8G内存,200G硬盘,网络桥接方式--静态IP----单网卡 node1计算节点---192.168.20.215 2cpu,8G内存,200G硬盘&a…

数据结构【初阶】--排序(归并排序和基数排序)

目录 一.归并排序的非递归写法 1.思想应用 2.代码基本实现 (1)单趟归并逻辑 (2)多趟&#xff08;循环&#xff09;的控制条件 ① 迭代条件&#xff1a;i2*gap ② 结束条件&#xff1a;i(或i<n-2*gap)<> (3)代码展示 ① 单趟逻辑 ②整体逻辑 3.优化代码…

《HTML 简易速速上手小册》第6章:HTML 语义与结构(2024 最新版)

文章目录 6.1 语义化标签的重要性6.1.1 基础知识6.1.2 案例 1&#xff1a;使用 <article>, <section>, <aside>, <header>, 和 <footer>6.1.3 案例 2&#xff1a;构建带有嵌套语义化标签的新闻网站6.1.4 案例 3&#xff1a;创建一个带有 <mai…

HAL库之看门狗

一、看门狗的介绍 &#xff08;1&#xff09;独立看门狗(IWDG)&#xff1a;独立看门狗由专用的低速时钟(LSI)驱动&#xff0c;即使主时钟发生故障它也仍然有效。因此叫独立&#xff0c;同时因此在低功耗模式下不能启动看门狗&#xff0c;低功耗详情见之前文章。IWDG比WWDG更精…