目录

  • “组件协作”模式
    • 模板方法模式
      • 动机
      • 模式定义
      • 结构
      • 要点总结

“组件协作”模式

  • 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”。“组件协作”模式通过晚期绑定,实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
  • 典型模式,以下模式在“组件协作”这一层面体现更明显
    • 模板方法模式 Template Method
    • 观察者模式 Observer / Event
    • 策略模式 Strategy

模板方法模式

动机

  • 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)子步骤无法和任务的整体结构同时实现。
  • 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?
  1. 结构化软件设计思维流程
    在这里插入图片描述
// templateLib.cpp	程序库开发人员
class Library
{
public:void Step1(){...}void Step3(){...}void Step5(){...}
};// templateApplication.cpp	应用程序开发人员
class Application
{
public:bool Step2(){...}void Step4(){...}
};// main.cpp	应用程序开发人员
int main()
{Library lib();Application app();// 应用程序开发人员编写主流程lib.Step1()if(app.Step2()){lib.Step3()}for (int i = 0; i < 3; i++){app.Step4();}lib.Step(5);
}
  1. 面向对象软件设计思维流程 在这里插入图片描述
// templateLib.cpp	程序库开发人员
class Library
{
public:// 稳定 template method,稳定中支持变化void Run(){// 程序库开发人员编写主流程Step1();if(Step2())		// 支持变化,虚函数的多态调用{Step3();}for (int i = 0; i < 4; i++){Step4();	// 支持变化,虚函数的多态调用}Step5();}virtual ~Library(){ }		// 基类析构函数写为虚函数protected:void Step1()		// 稳定{...}void Step3()		// 稳定{...}void Step5()		// 稳定{...}virtual bool Step2() = 0;	// 变化virtual void Step4() = 0;	// 变化
};// templateApplication.cpp	应用程序开发人员
class Application : public Library
{
protected:bool Step2 override(){//子类重写实现}void Step4 override(){// 子类重写实现}virtual ~Application override();
};// main.cpp	应用程序开发人员
int main()
{Library* pLib = new Application();	// 多态指针,基类类型指针指向派生类对象lib->Run();delete pLib;
}

如果 基类的析构函数不是虚函数,当通过 基类指针 删除 派生类对象 时,只会调用基类的析构函数,而不会调用派生类的析构函数,可能导致 内存泄漏 或 资源未释放。

  1. 早绑定与晚绑定
    在这里插入图片描述
    第一种方式早绑定(晚实现部分调用早实现部分)到第二种方式晚绑定(早实现部分调用晚实现部分)。

模式定义

定义一个操作中的算法的骨架(稳定,如前文中的run()),将一些步骤延迟到子类中(支持子类实现变化)。模板方法模式使得子类可以不改变(即复用)一个算法的结构即可重定义(override重写)该算法的某些特定步骤。

稳定中有变化,稳定的部分写为非虚函数,变化的部分写为虚函数。
设计模式最大的作用是在稳定变化之间,寻找隔离点,从而分离它们,管理变化。

结构

在这里插入图片描述
红色部分为稳定部分,蓝色部分为变化部分。

要点总结

  • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
  • 除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是 模板方法模式 的典型应用。
  • 在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法。

来源:极客班——C++设计模式入门

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

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

相关文章

Docker 运行RAGFlow 搭建RAG知识库

借鉴视频&#xff1a;DeepSeek 10分钟完全本地部署 保姆级教程 断网运行 无惧隐私威胁 大语言模型 CPU GPU 混合推理32B轻松本地部署&#xff01;DeepSeek模拟王者&#xff01;&#xff01;_哔哩哔哩_bilibili 借鉴博客&#xff1a;RAGFlow搭建全攻略&#xff1a;从入门到精通…

python编写脚本每月1号和15号执行一次将TRX是否强更发送到钉钉

编写脚本 import requests import json import time import hmac import hashlib import base64 import urllib.parse# 1. 配置钉钉机器人 webhook "https://oapi.dingtalk.com/robot/send?access_tokenXXXXXX" secret "XXXXXXXX" # 如果没有加签验…

Linux-系统管理

[rootlocalhost ~]# lscpu //查看cpu [rootlocalhost etc]# cat /etc/redhat-release //查看当前目录的版本信息 [rootlocalhost ~]# ifconfig //查看当前激活的网卡信息 [rootlocalhost ~]# ifconfig ens33 192.168.1.10 //给网卡配置临时地址 [rootlocalhost ~]# hostnam…

【Spring】系统化的 Spring Boot 全栈学习教程,涵盖基础配置、核心功能、进阶实战及文档自动生成

这里写目录标题 &#x1f6e0;️ **一、环境搭建与项目创建**1. 开发环境准备2. 创建第一个项目&#xff08;Spring Initializr&#xff09; &#x1f680; **二、核心功能开发**1. RESTful API 开发2. 数据持久化&#xff08;Spring Data JPA&#xff09;3. 配置文件多环境切换…

Discrete Audio Tokens: More Than a Survey

文章目录 模型设计的考虑量化的方式&#xff1a;比特率&#xff1a;Fixed vs. Adaptive Bitrate码本内容设计的考虑Streamability. 模型评估Reconstruction Evaluation and Complexity Analysis.识别和生成任务&#xff08;SE, SR)Acoustic Language Modeling.Music Generation…

设计在线教育项目核心数据库表

1 在线教育项目核心数据库表设计-ER图 简介&#xff1a;设计在线教育的核心库表结构 在线教育站点速览 xdclass.net ER图知识回顾&#xff1a; 实体对象&#xff1a;矩形属性&#xff1a;椭圆关系&#xff1a;菱形 核心库表 videochapterepisodeuservideo_ordervideo_banner…

【音视频】Ubuntu下配置ffmpeg库

一、下载预编译的库 在github上可以找到编译好的ffmpeg&#xff0c;多个版本的都有&#xff0c;这里我下载ffmpeg编译好的动态库 仓库链接&#xff1a;(https://github.com/BtbN/FFmpeg-Builds/releases 下载后解压得到 二、配置环境变量 打开.bashrc配置文件&#xff0c;添…

equine在神经网络中建立量化不确定性

​一、软件介绍 文末提供程序和源码下载 众所周知&#xff0c;用于监督标记问题的深度神经网络 &#xff08;DNN&#xff09; 可以在各种学习任务中产生准确的结果。但是&#xff0c;当准确性是唯一目标时&#xff0c;DNN 经常会做出过于自信的预测&#xff0c;并且无论测试数…

C++动态链接库之非托管封装Invoke,供C#/C++ 等编程语言使用,小白教程——C++动态链接库(一)

目录&#xff1a; 一、前言及背景1.1需求描述1.2应用背景 二、编程基础知识2.1非托管方式交互逻辑2.2该方式下C 与C# 数据转换对应2.3VS工程下的注意点2.4C封装接口2.4.1 __declspec(dllexport) 方式2.4.2 .def 文件方式2.4.3结合使用&#xff08;高级&#xff09; 2.5C# 封装接…

消息队列的网络模型详解:IO多路复用、Reactor模型、零拷贝

文章目录 一、消息队列的网路模型拟解决问题单个请求性能优化1. 编解码速度2. 网络模块处理速度 并发请求性能优化1. 高效的连接管理2. 快速处理高并发请求3. 大流量场景处理 二、一些技术基础知识1. 基于多路复用技术管理 TCP 连接&#xff08;提高性能&#xff09;&#xff0…

【生成模型】【模型介绍】(一)视频生成Wan2.1速度质量简单评测

基础模型&#xff1a;FramePack https://github.com/kijai/ComfyUI-FramePackWrapper huggingface-cli download Comfy-Org/HunyuanVideo_repackaged --local-dir Comfy-Org/HunyuanVideo_repackaged --resume-download huggingface-cli download Comfy-Org/sigclip_vision_3…

微信小程序之滑块scroll-view

我们要做的东西&#xff1a; 滑块的视频 我们先做个基本的图片和文字(wxm;)&#xff1a; <scroll-view><view class"scrollItem"><image src"https://bkimg.cdn.bcebos.com/pic/fc1f4134970a304e251fd88e8191b086c9177f3ef634?x-bce-processim…

如何写出优秀的单元测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 写出优秀的单元测试需要考虑以下几个方面&#xff1a; 1. 测试用例设计 测试用例应该覆盖被测试代码的不同场景和边界情况&#xff0c;以尽可能发现潜在的问题。…

Python LangChain 3.0 详解:重构大模型应用开发范式

引言 在人工智能技术日新月异的今天&#xff0c;大模型应用开发框架的迭代速度直接决定了AI落地的效率。LangChain作为这一领域的领军者&#xff0c;于2024年正式发布3.0版本&#xff0c;通过架构重构与功能扩展&#xff0c;为开发者提供了更强大的工具集。本文将深入解析Lang…

Java模板设计模式详解

以下是Java模板设计模式的详细解析&#xff1a; 一、核心定义 模板模式&#xff08;Template Method Pattern&#xff09;是一种‌行为型设计模式‌&#xff0c;通过定义算法骨架并允许子类重写特定步骤&#xff0c;实现代码复用与扩展。其核心在于控制‌流程标准化‌&#x…

Word 中批量转换 LaTeX 公式为标准数学格式的终极方法(附宏设置教程)

在学术写作中&#xff0c;我们常常需要将 LaTeX 格式的公式插入到 Word 文档中。但如果你有一大段公式使用 $...$ 或 LaTeX 命令&#xff0c;手动转换无疑非常耗时。本文将介绍一种“一键转换所有 LaTeX 公式为 Word 数学公式”的方法&#xff0c;只需设置一次宏&#xff0c;后…

linux上查看文件系统类型

假设 有文件系统mount在/data-pool&#xff1a; df -h ./ 文件系统 大小 已用 可用 已用% 挂载点 data-pool 1.5T 345M 1.5T 1% /data-pool如何查看 data-pool 这个文件系统的文件系统类型&#xff08;格式&#xff09;&#xff0c;比如是 ext4、btrfs、z…

Android14-HAL分析

文章目录 一、HAL综述二、Android各版本HAL的演进三、传统HAL(< Android7)四、HIDL HAL(Android8-10)1、参考资料2、概述2、架构3、实现一个HIDL HAL1&#xff09;HIDL的开发流程2&#xff09;HIDL HAL的语法3&#xff09;创建HAL接口&生成impl库4&#xff09;Service实…

【WebSocket】学习总结

是一种协议&#xff1b; 作用与Web应用程序和服务端之间&#xff1b; 实时的、双向的&#xff1b; 通过单一的TCP提供了持久化连接&#xff1b; 优势&#xff1a; 实时、双向、可以减少网络的负载&#xff1b; 劣势&#xff1a; 需要客户端和服务端双方都支持&#xff1b; 连续…

“组件协作”模式之策略模式

目录 策略模式引例动机 Motivation模式定义结构要点总结 策略模式 引例 税务计算系统&#xff0c;根据各个国家的税法&#xff0c;进行税务计算。各个国家税法规定差别很大&#xff0c;需对应进行相应的实现。 常规解耦前写法 使用if-else语句或switch-case语句进行结构化分…