当前位置: 首页 > news >正文

《设计模式》模板方法

《设计模式》模板方法

模板方法是一种行为型设计模式,用于定义一个算法的框架,而将一些步骤的实现留给子类来完成。模板方法在基类中定义了一个模板方法,该方法确定了算法的基本结构,然后将一些步骤的实现交给子类去完成。这个模板方法可以看作是一个“模板”,即算法的框架。具体实现则由子类来完成。

模板方法的优点有:

  1. 提高了代码的复用性:将一些公共的代码放在基类中,避免了重复的代码,提高了代码的复用性。
  2. 提高了代码的可维护性:将一些公共的代码放在基类中,便于修改和维护。
  3. 实现了对扩展开放、对修改关闭的原则:基类中定义的模板方法固定了算法的框架,不需要修改基类的代码,就可以通过子类来扩展和修改算法的具体实现。
  4. 降低了耦合性:子类只需要实现基类中的一些方法,而不需要关心算法的整个过程,降低了子类与基类的耦合性。

模板方法的使用场景有:

  1. 当多个类有共同的算法框架时,可以使用模板方法来避免重复的代码。
  2. 当我们需要在不同的类中实现相同的算法时,可以使用模板方法来提高代码的复用性。
  3. 当我们需要让子类自由扩展某些算法步骤的实现时,可以使用模板方法。
#include <iostream>using namespace std;class BaseClass {
public:void templateMethod() {// 调用基础方法baseMethod1();baseMethod2();// 调用子类实现的方法specializedMethod();}void baseMethod1() {cout << "这是基础方法1" << endl;}void baseMethod2() {cout << "这是基础方法2" << endl;}virtual void specializedMethod() = 0;
};class ConcreteClassA : public BaseClass {
public:void specializedMethod() override {cout << "这是ConcreteClassA实现的方法" << endl;}
};class ConcreteClassB : public BaseClass {
public:void specializedMethod() override {cout << "这是ConcreteClassB实现的方法" << endl;}
};int main() {BaseClass* objA = new ConcreteClassA();BaseClass* objB = new ConcreteClassB();objA->templateMethod();objB->templateMethod();delete objA;delete objB;return 0;
}

上述代码中,我们首先定义了一个抽象基类BaseClass,它包含了一个模板方法templateMethod和两个基础方法baseMethod1baseMethod2,并且定义了一个纯虚方法specializedMethod。这个抽象基类中的模板方法调用了基础方法和子类实现的方法,这些方法在具体子类中可以被实现。

然后我们定义了两个具体子类ConcreteClassAConcreteClassB,它们都继承了基类BaseClass并实现了specializedMethod方法。

在主函数中,我们分别创建了ConcreteClassAConcreteClassB的实例,并且调用了它们的模板方法templateMethod。这样,我们就可以通过模板方法设计模式来实现不同的子类中共同的算法框架,同时又能够在子类中实现自己的特定方法。

C++ sort

模板方法应用极为普遍,可能很多时候我们都没注意,如C++中的sort函数我们可以自定义比较函数,这个可以由我们自定义的比较函数来进行排序的sort函数就是应用了模板方法。

相关文章:

《设计模式》模板方法

《设计模式》模板方法 模板方法是一种行为型设计模式&#xff0c;用于定义一个算法的框架&#xff0c;而将一些步骤的实现留给子类来完成。模板方法在基类中定义了一个模板方法&#xff0c;该方法确定了算法的基本结构&#xff0c;然后将一些步骤的实现交给子类去完成。这个模…...

Linux环境内存管理——链表

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Windows程序员如何学习Linux环境内存管理。由于很多程序在Windows环境下开发好后&#xff0c;还要部署到Linux服务器上去&#xff0c;所以作为Windows程序员有必要学习Linux环境的内存…...

String、StringBuffer、StringBuilder类

String类 由多个字符组成的一串数据,值一旦创建不可改变 private final char value[]; 一旦值改变,就会创建新的对象 String s "abc"; //char[] c {a,b,c}s"def"; // 并不是String的值改变,而是创建了一个新的对象s"gh";s"aaa"…...

在VScode中添加Linux中的Docker容器中的Python解释器

VScode编辑器在安装好Python插件之后会自动选择环境变量中排序最高的那一个解释器作为默认解释器&#xff0c;而想要额外添加新的Python解释器就需要自己设置。 VScode编辑器安装在本地电脑 支持Python的docker安装在远程服务器 第一步&#xff0c;在/usr/local/下新建pytho…...

无法将“django-admin”项识别为cmdlet,函数,脚本文件或可运行程序的名称问题

无法将“django admin”项识别为cmdlet&#xff0c;函数&#xff0c;脚本文件或可运行程序的名称问题 小提示&#xff1a;首先检查一下有没有拼写错误&#xff01;&#xff01;&#xff01;没有的话请继续 我们要知道django装到哪里去了 pip show django 注意&#xff1a;3.0…...

乐友商城学习笔记(十五)

无状态登陆原理 在服务器端保存session 无状态不需要session&#xff0c;把登陆状态保存在cookie中 jwtrsa token&#xff1a;登陆时&#xff0c; jwt oath2 jwt&#xff1a;头信息&#xff08;jwt&#xff09; 载荷&#xff08;用户信息&#xff0c;签发人&#xff0c;签发时…...

目标检测论文阅读:CBNet算法笔记

标题&#xff1a;CBNet: A Composite Backbone Network Architecture for Object Detection 期刊&#xff1a;TIP2022 论文地址&#xff1a;https://ieeexplore.ieee.org/document/9932281/ 官方代码&#xff1a;https://github.com/VDIGPKU/CBNetV2 作者单位&#xff1a;北京大…...

vue前端与Java后端进行跨域交互

1.后端的几种解决方法 1.在Controller上面加上CrossOrigin 2.写一个配置文件并且在Controller层加上注解CORSConfig package com.wolwo.langyage.base.util;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configurat…...

【设计模式】2.抽象工厂模式

抽象工厂模式 前面介绍的工厂方法模式中考虑的是一类产品的生产&#xff0c;如畜牧场只养动物、电视机厂只生产电视机、传智播客只培养计算机软件专业的学生等。 这些工厂只生产同种类产品&#xff0c;同种类产品称为同等级产品&#xff0c;也就是说&#xff1a;工厂方法模式…...

Telnet 基础实验1: Telnet 实验

Telnet 基础实验1&#xff1a; Telnet 实验 拓扑图 配置命令 R1 的配置 undo ter mo sys sys R1 interface g0/0/0 ip address 192.168.1.1 255.255.255.0 qR2 的配置 undo ter mo system-view sysname R2 interface g0/0/0 ip address 192.168.1.2 255.255.255.0 q两台设…...

机器学习经典算法——决策树(Decision Tree)

决策树的基本原理 决策树是⼀种分⽽治之的决策过程。⼀个困难的预测问题&#xff0c;通过树的分⽀节点&#xff0c;被划分成两个或多个较为简单的⼦集&#xff0c;从结构上划分为不同的⼦问题。将依规则分割数据集的过程不断递归下去。随着树的深度不断增加&#xff0c;分⽀节…...

MySQl总结

文章目录MySQL数据库的常见考点1、ACID事务原理事务持久性事务原子性MVCC基本概念MVCC基本原理undo logundo log版本链readviewMVCC实现原理RC读已提交RR可重复读MVCC实现原理总结2、并发事务引发的问题3、事务隔离级别4、索引索引结构BTreeHash面试题索引分类思考题语法性能分…...

【学习笔记】NOIP爆零赛7

结论专场&#xff0c;结果被踩暴了 青鱼和序列 赛时的做法是&#xff0c;维护∑aii\sum a_i\times i∑ai​i的取值&#xff0c;发现只和最后一次操作222的位置有关&#xff0c;于是递推O(n)O(n)O(n)解决。 赛后发现还有更神奇的结论 第二个结论是&#xff0c;第一次进行操作…...

一文读懂账号体系产品设计

一、账号体系的概念及价值账号体系是用户在各平台上的通行证。平台给与用户可持续的服务&#xff0c;用户在平台上获取价值&#xff0c;中间的媒介&#xff0c;便是账号体系。阿境将其理解为维系用户与平台之间的枢纽。注&#xff1a;本文中&#xff0c;账号账户&#xff0c;二…...

从“入门”到“专家”,一份3000字完整的性能测试体系的知识分享

随着科技的飞速发展&#xff0c;软件产品广泛应用于各个行业领域&#xff0c;人们对计算机和网络的依赖性越来越大&#xff0c;对新奇事物也越来越感兴趣&#xff0c;成千上万的用户活跃在庞大的网络系统中&#xff0c;这给提供服务的系统带来严重的负荷&#xff0c;"高并…...

构建对话机器人:Rasa3安装和基础入门

在开源对话机器人中&#xff0c;Rasa社区很活跃&#xff0c;在国内很多企业也在使用Rasa做对话机器人&#xff0c;有rasa开发经验的往往是加分项。 当年实习的时候接触到了Rasa&#xff0c;现在工作中也使用Rasa&#xff0c;因此&#xff0c;写写一些经验文档&#xff0c;有助后…...

Spark计算框架入门笔记

Spark是一个用于大规模数据处理的统一计算引擎 注意&#xff1a;Spark不仅仅可以做类似于MapReduce的离线数据计算&#xff0c;还可以做实时数据计算&#xff0c;并且它还可以实现类似于Hive的SQL计算&#xff0c;等等&#xff0c;所以说它是一个统一的计算引擎 既然说到了Spar…...

入职数据分析公认的好书|建议收藏

众所周知&#xff0c;数据分析经常出现在我们的日常生活中&#xff0c;各行各业都需要数据分析。可你知道什么是数据分析&#xff1f;它在企业里到底扮演什么角色&#xff1f;以及如果我们自己也想拥有数据分析的能力&#xff0c;以便更好的满足数据分析的需求&#xff0c;我们…...

Linux查找文件和目录,重定向输出 ,系统默认运行级别的查看和设置理论和练习

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

Redis源码---键值对中字符串的实现,用char*还是结构体

目录 前言 为什么 Redis 不用 char*&#xff1f; char* 的结构设计 操作函数复杂度 SDS 的设计思想 SDS 结构设计 SDS 操作效率 紧凑型字符串结构的编程技巧 小结 前言 对于 Redis 来说&#xff0c;键值对中的键是字符串&#xff0c;值有时也是字符串在 Redis 中写入一…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...