设计模式-模板方法模式

定义

模板方法模式是一种行为型设计模式,它定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。这种模式允许子类在不改变算法结构的情况下,重新定义算法的特定步骤。

模板方法模式的结构包括抽象类和具体子类。抽象类负责给出算法的轮廓和骨架,它由一个模板方法和若干个基本方法构成。模板方法定义了一套算法的骨架,按某种顺序调用其包含的基本方法。这些基本方法可以由子类进行不同的实现。

使用模板方法模式需要注意抽象类与具体子类之间的协作,以及虚函数的多态性和反向控制技术。通过合理地设计抽象类和具体子类,我们可以实现算法的灵活性和可扩展性。

实现举例

#include <iostream>// 抽象类定义算法的骨架
class AbstractClass {
public:virtual void templateMethod() = 0;virtual void method1() = 0;virtual void method2() = 0;
};// 具体子类实现算法的各个步骤
class ConcreteClass1 : public AbstractClass {
public:void templateMethod() override {method1();method2();}void method1() override {std::cout << "ConcreteClass1 method1" << std::endl;}void method2() override {std::cout << "ConcreteClass1 method2" << std::endl;}
};// 另一个具体子类实现算法的各个步骤
class ConcreteClass2 : public AbstractClass {
public:void templateMethod() override {method1();method2();}void method1() override {std::cout << "ConcreteClass2 method1" << std::endl;}void method2() override {std::cout << "ConcreteClass2 method2" << std::endl;}
};int main() {AbstractClass* obj1 = new ConcreteClass1();obj1->templateMethod(); // 输出:ConcreteClass1 method1 ConcreteClass1 method2delete obj1;AbstractClass* obj2 = new ConcreteClass2();obj2->templateMethod(); // 输出:ConcreteClass2 method1 ConcreteClass2 method2delete obj2;return 0;
}

总结

模板方法模式的特性主要包括:

  1. 封装不变部分:模板方法模式通过把不变的行为搬移到抽象类,去除子类中的重复代码。
  2. 定义算法的骨架:模板方法模式在抽象类中定义了算法的骨架,即模板方法。这个模板方法通常包含一个或多个基本方法,这些基本方法可以由子类来实现。
  3. 可扩展性:模板方法模式允许子类在不改变算法结构的情况下,重新定义算法的特定步骤。这种可扩展性使得我们可以根据需要添加新的行为,符合“开闭原则”。
  4. 反向控制结构:模板方法模式通过一个父类调用其子类的操作,而不是相反的子类调用父类,这种反向的控制结构有时被称为“好莱坞法则”,即“别找我们,我们找你”。
  5. 代码复用:模板方法模式是一种代码复用的基本技术,它在类库中尤为重要,可以提取类库中的公共行为。

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

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

相关文章

android 内存分析(待续)

/proc/meminfo memory状态解读 命令&#xff1a;adb shell cat /proc/meminfo内存分布log 查看方式 命令&#xff1a;adb shell cat /proc/meminfo 用途:可以整体的了解memory使用情况 我们说的可用memory一般以MemAvailable的数据为准。所以了解MemAvailable的组成可以帮助…

【LeetCode刷题-链表】--86.分隔链表

86.分隔链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class…

建筑木模板厂家批发

在建筑施工中&#xff0c;木模板是一种常见且重要的施工材料&#xff0c;用于搭建混凝土浇筑的支撑结构。选择合适的建筑木模板厂家进行批发&#xff0c;对于施工质量和效率至关重要。本文将介绍建筑木模板厂家批发的重要性&#xff0c;并推荐贵港市能强优品木业作为专业的建筑…

将文件读入C中的字符数组

当您使用 C 编程语言时&#xff0c;您可能会遇到一些需要将文件读入字符数组的问题&#xff0c;例如分析每个字符的频率&#xff0c;或者将所有句子的每个起始词从小写转换为大写&#xff0c;反之亦然。该解决方案非常简单&#xff0c;但对于不太了解文件读取或写入的人来说可能…

MVVM 模式与 MVC 模式:构建高效应用的选择

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

世岩清上:什么是元宇宙

元宇宙是一个虚拟的数字世界&#xff0c;它是一种全新的互联网形式&#xff0c;是一个可以提供身临其境体验的虚拟世界。元宇宙融合了现实和虚拟&#xff0c;允许用户在这个数字空间中自由探索、创造和交互。 元宇宙的概念源于科幻小说和电影&#xff0c;它最早出现在1992年的…

【SQL SERVER】定时任务

oracle是定时JOB&#xff0c;sqlserver是创建作业&#xff0c;通过sqlserver代理实现 先看SQL SERVER代理得服务有没有开 选择计算机右键——>管理——>服务与应用程序——>服务——>SQL server 代理 然后把SQL server 代理&#xff08;MSSQLSERVER&#xff09;启…

开源vs闭源,大模型的未来在哪一边?

开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。开源让技术共享&#xff0c;吸引了众多人才加入&#xff0c;推动了大模的创新。而闭源则保护了商业利益和技术优势&#xff0c;为大模型的商业应用提供了更好的保障。 那么&#xff0c…

Vue3+java开发组队功能

Vue3java开发系统组队功能 需求分析 创建用户可以创建一个队伍&#xff08;一个房间队长&#xff09;&#xff0c;设置队伍人数&#xff0c;队伍名称&#xff08;标题&#xff09;&#xff0c;描述&#xff0c;超时时间。搜索加入&#xff0c;用户可以加入未满的队伍&#xf…

github新建项目

参考链接&#xff1a;Github上建立新项目超详细方法过程 在这里新建一个repositories 接下来就选择相关的信息&#xff1a; 然后create a new就行了 接下来需要创建文件&#xff1a;&#xff08;同时通过upload上传文件&#xff09; 每次最多上传100个文件&#xff0c;然后保…

OpenGL笔记:纹理的初次使用

说明 纹理的代码写完后&#xff0c;一直出不来结果&#xff0c;原因是没有设置GL_TEXTURE_MIN_FILTER&#xff0c; 它的默认值为GL_NEAREST_MIPMAP_LINEAR&#xff0c; 因为这里我还没用到Mipmap&#xff0c;所以使用这个默认值&#xff0c;结果是错误的&#xff0c;关于mipma…

软著项目推荐 深度学习二维码识别

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

正点原子linux应用编程——提高篇1

在之前的入门篇学习中&#xff0c;都是直接在Ubuntu中进行验证的&#xff0c;对于嵌入式Linux系统来说&#xff0c;也是可以直接移植的&#xff0c;只需要使用嵌入式硬件平台对应的交叉编译工具编译应用程序即可运行。 在嵌入式Linux系统中&#xff0c;编写的应用程序通常需要…

Prometheus的详细部署

普罗米修斯下载网址: Download | Prometheus 准备两台机器&#xff1a; 192.168.58.152 prometheus 192.168.58.142 node_exporter 关闭防火墙和selinux&#xff1a; [rootlocalhost ~]# setenforce 0 && systemctl stop firewalld[rootlocalhost ~]# seten…

nginx https 一个端口代理多个前端项目

打包修改 &#xff01;&#xff01;&#xff01;注意&#xff1a;第一个location root 调用的项目不用修改 打包路径&#xff0c;直接用 ‘/’&#xff0c;其他项目或者需加 /mobile 路径 worker_processes 1; events {worker_connections 1024; } http {include mime.…

K8S集群中PLEG问题排查

一、背景 k8s集群排障真的很麻烦 今天集群有同事找我&#xff0c;节点报 PLEG is not healthy 集群中有的节点出现了NotReady&#xff0c;这是什么原因呢&#xff1f; 二、kubernetes源码分析 PLEG is not healthy 也是一个经常出现的问题 POD 生命周期事件生成器 先说下PL…

for for in for of 的区别

for是JavaScript中最基本的循环语句&#xff0c;它可以用于遍历数组和对象中的元素&#xff0c;语法如下&#xff1a; for (初始化; 判断条件; 增量) {// 循环体 }其中&#xff0c;初始化是循环开始前执行的语句&#xff0c;判断条件是判断循环是否可以继续的条件&#xff0c;…

Pybullet -------[ 1 ]

1. p.addUserDebugText() 这个函数允许在仿真环境中动态添加文本&#xff0c;用于调试和可视化。你可以指定文本的内容、位置、颜色、大小等属性。 p.addUserDebugText(text, textPosition, textColorRGB[1,1,1], textSize1, lifeTime0, parentObjectUniqueId0,parentLinkInde…

机器视觉双目测宽仪具体有什么优势?

双目测宽仪是机器视觉原来制造而成的智能宽度检测设备&#xff0c;广泛应用于板材类产品的宽度检测。通过测宽仪的使用&#xff0c;实时了解产品宽度品质&#xff0c;进行超差提示&#xff0c;减少废品的生产。 双目测宽仪优势 测量软件界面显示&#xff1a;产品规格、标称宽…

MATLAB算法实战应用案例精讲-【图像处理】FPGA

目录 前言 算法原理 FPGA 是什么 FPGA的定义以及和GPU的类比 FPGA 有什么用 1)通信领域