MQTT 发布功能实现
MQTT的发布功能是客户端向Broker发送消息到指定主题的核心操作,结合paho-mqtt C++库,实现发布功能需遵循连接Broker→构造消息→发布消息→处理发布结果的流程。以下是具体步骤、代码示例及关键细节说明。 一、实现发布功能的核心步骤 初始化客户端并连接Broker:先建立与MQTT Broker的连接(基础前提)。 构造MQTT消息:指定消息的主题、负载(内容)、QoS等级、保留标志等属性。 调用发布接口:通过客户端实例发送消息,支持同步/异步发布。 处理发布结果:通过回调或返回值确认消息是否发布成功(尤其QoS>0时)。 断开连接(可选):发布完成后按需断开与Broker的连接。 二、基础发布功能实现(同步发布)步骤1:配置基础信息定义Broker地址、客户端ID、发布主题等常量: 1234567#include <iostream>#include <mqtt/client.h>// 配置信息const std::string BROKER_ADDRESS = "tcp://test.mosquitto.or...
MQTT安全性
一、导言MQTT协议基于发布/订阅(Publish/Subscribe)架构,具备轻量、低带宽占用、低功耗、高可靠性等特性,广泛应用于智能家居、工业控制、智能医疗、车联网等物联网场景。然而,物联网设备的分布式部署、资源受限特性以及网络传输的开放性,使得MQTT协议面临诸多安全威胁,如传输数据窃听、身份伪造、权限越权、Broker节点攻击等。据OWASP IoT Top 10统计,2024年物联网系统中因协议安全机制缺失或配置不当导致的安全事件占比达42%,其中MQTT协议相关安全问题尤为突出。因此,系统梳理MQTT安全机制,规避安全误区,对提升物联网系统整体安全性具有重要现实意义。 二、MQTT核心安全机制解析MQTT协议本身未定义完整的安全体系,其安全性主要依赖于传输层加密、应用层身份认证与权限控制以及Broker节点的安全配置。以下从五大核心维度展开详细分析: 2.1 传输层加密:TLS/SSL机制传输层安全是MQTT协议安全的基础,主要通过TLS(Transport Layer Security)/SSL(Secure Sockets...
TCP与MQTT握手机制
在网络通信中,“握手”是保障连接可靠、消息有序的核心机制。但不同协议的“握手”定位天差地别——TCP的三次握手是传输层的“连接基石”,MQTT的“四次交互”是应用层的“消息保障”,甚至有同学会疑惑“TCP为何不用四次握手”“MQTT为啥没有TCP那样的握手机制”。今天我们就整合这些疑问,一次性把TCP与MQTT的握手机制讲透。 一、先澄清概念:别混淆“连接握手”与“消息交互”很多人会把TCP的“三次握手”和MQTT QoS2的“四次交互”混为一谈,核心是没分清两者的本质差异: - TCP握手机制:传输层协议的核心功能,仅用于「建立/关闭可靠连接」。核心是三次握手建连(SYN→SYN+ACK→ACK)、四次挥手断连,解决的是“底层通道能否互通、序列号如何同步、连接如何安全收尾”的问题。 - MQTT交互机制:应用层协议的可选功能,仅用于「保障消息可靠投递」。核心是QoS2级别的四次交互(PUBLISH→PUBREC→PUBREL→PUBCOMP),解决的是“单条消息如何恰好一次交付、避免重复或丢失”的问题,且运行在已建立的TCP连接之上。 核心结论:TCP握手管“通道建立...
MQTT QoS
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)作为物联网(IoT)领域广泛应用的通信协议,其核心优势之一在于通过可配置的服务质量(Quality of Service,QoS)等级,实现消息传输可靠性与资源开销的动态平衡。对于物联网开发者而言,深入理解QoS的设计逻辑、交互机制(握手流程)及应用场景适配原则,是保障设备间通信稳定性、优化系统资源配置效率的关键前提。 一、MQTT QoS 核心定位:为何需要多等级服务质量?物联网场景中的终端设备呈现显著的异构性特征,既包含联网稳定性高、计算能力充足的工业网关设备,也涵盖电池供电、带宽资源受限的低功耗传感器(如LoRa传感器、NB-IoT设备等);同时,传输环境的差异性突出,既涉及丢包率低的稳定局域网,也包括丢包率较高的无线广域网(如蜂窝网络边缘区域)。若采用单一的消息传输策略,极易出现两类问题:其一,为追求传输可靠性而引入复杂的确认机制,导致资源受限设备的不必要开销;其二,忽视传输可靠性保障,造成核心业务指令(如工业控制指令)丢失,影响系统正常运行。 MQTT协议设计QoS机制的...
MQTT 保留消息与遗嘱机制
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)作为物联网(IoT)领域广泛应用的轻量级机器对机器(M2M)通信协议,凭借低带宽占用、低功耗消耗及低传输延迟等核心优势,成为设备间数据交互的主流技术方案。在MQTT协议的核心特性体系中,**保留消息(Retain Message)与遗嘱消息(Last Will and Testament,简称Last Will)**是保障消息传输可靠性及设备运行状态感知能力的关键机制。本文将系统剖析二者的技术原理、应用场景、潜在风险,并结合物联网实际部署需求提出针对性的最佳实践策略。 一、保留消息(Retain Message):新订阅节点的主题状态快照机制MQTT保留消息指消息代理(Broker)对发布者发送的携带保留标识(Retain Flag = 1)的消息进行持久化存储。当新订阅者订阅该消息对应的主题时,Broker会主动将存储的该主题最新保留消息推送至新订阅者。本质而言,保留消息机制为主题提供了“最新状态快照”功能,使新订阅者无需等待发布者后续的消息推送,即可快速获取主题对应的...
MQTT协议轻量性与高效性的实现机制
在物联网(IoT)及移动终端应用领域,协议的轻量化与传输高效性是核心选型准则。此类场景中,大量终端设备(如传感器节点)存在算力与能源受限问题,且网络环境常面临带宽瓶颈与稳定性不足等挑战。消息队列遥测传输(MQTT)协议自1999年问世以来,凭借其极致的轻量化设计与高效的传输性能,已成为IoT领域主流通信协议之一,同时在移动终端推送、车联网等场景中得到广泛应用。 一、MQTT协议轻量高效的核心实现机制:基于设计细节的优化MQTT协议的轻量性与高效性并非依赖单一技术创新,而是通过报文格式、连接管理、通信架构等多维度的“减法设计”与精准优化实现的,其设计核心始终围绕“降低资源占用、提升传输效率”两大目标展开。 1. 极简报文结构设计:降低带宽占用,适配小数据传输报文是协议通信的核心载体,MQTT协议采用极简报文结构设计,核心目标为最小化数据传输量,这一设计对带宽资源受限的IoT场景(如蜂窝网络、LoRa网关通信场景)具有重要适配价值。 MQTT报文由固定头、可变头与有效载荷三部分构成,其中固定头为必选模块,最小长度仅2字节——这意味着即使是空消息传输,其开销也仅为2字节,远低于HTTP...
MQTT协议与传统HTTP协议
在物联网(IoT)、移动互联网等现代信息通信领域,通信协议的选型直接决定系统的性能表现、运行稳定性及运维成本。消息队列遥测传输(MQTT,Message Queuing Telemetry Transport)协议作为面向低带宽、低功耗终端设备设计的轻量级通信协议,与传统的超文本传输协议(HTTP,HyperText Transfer Protocol)在技术架构、传输特性等方面存在显著差异。 一、核心维度对比概览为清晰呈现两种协议的核心差异,首先通过表格对各关键维度进行归纳对比,为后续的深度分析构建基础框架。 对比维度 MQTT HTTP 架构模式 发布/订阅(Pub/Sub)架构,依赖中间代理节点(Broker)实现消息转发 客户端/服务器(C/S)架构,无中间转发节点,采用点对点直接通信模式 连接方式 基于TCP协议的长连接机制,连接建立后持续保持,支持心跳保活(Keep-Alive)机制保障连接稳定性 默认采用TCP短连接(HTTP/1.0),请求-响应完成后连接即释放;HTTP/1.1支持长连接...
MQTT:物联网轻量级通信协议
在物联网(IoT)场景中,设备与设备、设备与云端的通信需要面对三大核心挑战:带宽有限(如传感器、智能硬件多采用蜂窝网络/蓝牙)、设备资源受限(低功耗芯片算力/内存有限)、网络不稳定(移动场景下频繁断连)。而 MQTT 协议正是为解决这些痛点而生的轻量级消息传输协议——它像物联网世界的“微信”,让海量设备能高效、可靠地传递信息。 本文将从“是什么-为什么用-核心原理-实战场景”四个维度,用工程师易懂的语言拆解 MQTT,既讲清底层逻辑,也给出实际应用参考。 一、MQTT 核心定义:物联网的“轻量级通信协议”1. 协议本质MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是 1999 年诞生的基于发布/订阅(Pub/Sub)模式的应用层协议,专为低带宽、高延迟、不可靠网络设计。 核心定位:“物联网场景的 TCP/IP 补充”——基于 TCP 协议实现可靠传输,同时通过极简的协议头、灵活的 QoS 机制,降低设备通信成本。 2. 关键特性(为什么物联网首选 MQTT?) 特性 具体说...
CMake+Git实现C++项目版本号自动更新
一、核心需求与版本规则复盘在动手前先明确核心目标,避免版本管理混乱: 版本格式:主版本.MINOR.补丁版本(语义化规范,如 2.3.15) 规则 1:主版本 / 小版本(MINOR)手动更新时,补丁版本重置为当前 Git 提交数 规则 2:无主 / 小版本变更时,补丁版本自动跟随 Git 提交数递增 规则 3:版本号需嵌入代码(如 version.h)、构建产物(如二进制文件名)、CI/CD 流程 优势:无需手动维护补丁版本,Git 提交记录即版本追溯依据,避免重复或遗漏。 二、CMake 实现方案(零外部依赖)核心思路:用 CMake 内置命令调用 Git 获取提交数,结合手动配置的主 / 小版本,自动生成完整版本号,并同步到代码和构建流程。 1. 完整 CMake 脚本(version.cmake)创建独立的 version.cmake 文件(便于复用),放入工程根目录: 12345678910111213141516171819202122232425262728293031323334353637383940414...
Linux service 个人服务管理规范
1. 文档目的用于 Linux 主机使用 systemd 管理服务的方式,包括: 服务文件规范 统一的日志与目录要求 启停、上线、变更流程 服务异常排查方法 常见问题解决 适用于:后端服务、守护进程、数据处理任务等所有 systemd 托管的服务。 2. 服务文件基本规范2.1 服务文件位置与命名 项目 规范 存放路径 /etc/systemd/system/ 文件后缀 .service 命名方式 project-name.service(全部小写,使用短横线连接) 示例: 12myserver-api.service job-dispatcher.service 禁止 放在 /usr/lib/systemd/system/(避免被系统升级覆盖) 使用大写或空格命名 2.2 文件权限与属主 项目 要求 权限 644 所有者 root:root 命令: 12sudo chown root:root /etc/systemd/system/myserver.servicesudo chmod 644 /etc/systemd/sy...
Linux service 与 systemd
在 Linux 系统运维与开发中,服务管理是核心基础能力之一。从早期的 SysV init 到如今主流的 systemd,服务管理机制经历了颠覆性的变革。作为工程师,理解二者的设计差异、systemd 的核心架构以及其与内核的交互逻辑,不仅能提升日常运维效率,更能在服务调优、故障排查中直击本质。 一、从 SysV init 到 systemd:服务管理的演进逻辑在 systemd 普及之前,Linux 系统普遍采用 SysV init 作为初始化系统(PID 1),其核心是基于脚本的串行启动机制。每个服务对应 /etc/init.d/ 目录下的一个 Shell 脚本,启动顺序由 /etc/rc*.d/ 中的符号链接优先级(如 S01xxx、S99xxx)决定。这种设计简单直观,但存在三个致命缺陷: 串行启动效率低:服务按顺序逐一启动,即使服务间无依赖关系,也需等待前一个服务启动完成,导致系统启动耗时过长; 依赖管理简陋:依赖关系需通过脚本内的逻辑或启动优先级手动维护,易出现依赖缺失或顺序错乱问题; 监控与控制能力弱:对服务的运行状态监控、异常重启、资源限制等支持不足,需依赖第三...
C++ 语句解析器实战:用注册式工厂打造可扩展语法分析器
在开发脚本引擎或配置解析工具时,我们经常需要处理多种类型的语句(赋值、条件、循环等)。本文将通过一个实用的语句解析器案例,展示如何用注册式工厂模式构建易于扩展的解析系统。 一、需求分析与设计思路我们需要开发一个支持以下语句类型的解析器: 赋值语句(如x = 100) 条件语句(如if x > 5) 循环语句(如for i in 0..10) 核心挑战是:当需要支持新语句类型时,无需修改现有解析逻辑,只需添加新的解析器实现。这正是工厂模式的用武之地。 整体设计方案: 定义抽象解析器接口(基类) 为每种语句实现具体解析器(派生类) 用注册式工厂管理解析器的创建 通过语句特征自动匹配对应的解析器 二、核心代码实现1. 抽象解析器接口首先定义所有解析器的公共接口: 12345678910111213#include <string>// 语句解析器基类class StatementParser {public: virtual ~StatementParser() = default; // 解析语句(提取关键信息)...
C++ 模板工厂模式:从手动注册到自动发现的进化之路
在软件开发中,工厂模式是解耦对象创建与使用的经典方案。但传统工厂模式在面对频繁新增产品时,总会陷入修改工厂类的尴尬。本文将带你探索如何用 C++ 模板实现自动注册的工厂模式,彻底解决这一痛点。 一、传统工厂的 "if-else 地狱"假设我们要开发一个支持多种日志输出的组件(控制台日志、文件日志、网络日志),传统工厂实现可能是这样的: 123456789101112131415161718class Logger {public: virtual void log(const std::string& msg) = 0; virtual ~Logger() = default;};class ConsoleLogger : public Logger { /* 实现 */ };class FileLogger : public Logger { /* 实现 */ };class LoggerFactory {public: static std::unique_pt...
Gerrit使用指北
一、Gerrit 是什么?为什么需要它?Gerrit 是一款基于 Git 的开源代码审查工具,核心价值在于强制代码评审流程,通过多人协作把关代码质量,减少线上缺陷,同时保留完整的变更追溯记录。它特别适合中小型团队: 支持细粒度权限控制(谁能提交 / 评审 / 合并代码) 与 Git 原生兼容,无需改变现有开发习惯 网页端可视化评审界面,支持评论、打分、变更追踪 可集成 CI/CD 流程(如 Jenkins、GitHub Actions),实现自动化验证 对比直接提交 Git 仓库:Gerrit 通过「虚拟分支」机制拦截直接提交,确保所有代码变更都经过评审,尤其适合需要严格质量管控的 C/C++ 工程(如嵌入式、工具类项目)。 二、环境准备与安装配置(服务器端)1. 核心依赖 操作系统:Linux(推荐 Ubuntu 20.04+/CentOS 7+) 依赖软件:Java 8+(Gerrit 基于 Java 开发)、Git、数据库(默认 H2,生产环境推荐 MySQL/PostgreSQL) 2. 安...
CMake+Git实现C++项目版本号管理
一、基础认知:版本号规范与核心逻辑在开展实操之前,需明确两个核心基础内容:版本号的规范化格式标准与该方案的核心实现逻辑,为后续操作提供理论支撑。 1. 语义化版本规范(SemVer)建议采用「语义化版本规范(Semantic Versioning, SemVer)」,其格式定义为:主版本号.次版本号.补丁版本号(例如 v1.2.3),各组成部分的语义含义如下: 主版本号(Major):当项目进行不兼容的API变更时递增,此时旧版本代码无法直接适配(例如 v2.0.0,代表项目功能架构发生重大调整); 次版本号(Minor):当项目新增向后兼容的功能时递增,不影响现有代码的正常运行(例如 v1.3.0,代表在原有基础上扩展功能); 补丁版本号(Patch):当项目进行向后兼容的问题修复时递增,仅修正缺陷不新增功能(例如 v1.2.4,代表针对现有版本的Bug修复); 可选后缀:包括预发布版本标识(例如 v1.2.3-beta,用于标识测试阶段版本)与构建信息(例如 v1.2.3+20241201,用于记录版本编译时间)。 2. 整体实现逻辑该方案的核心逻辑可概括为:通过...
timefd定时器封装
导言在 Linux 系统开发中,定时器是一个非常常见的需求。除了传统的setitimer、alarm等接口,Linux 还提供了一种基于文件描述符的定时器机制 ——timerfd。这种机制将定时器事件转化为文件描述符的可读事件,非常适合与 I/O 多路复用(如poll、epoll)结合使用。 一、简介timerfd是 Linux 内核 2.6.25 版本后引入的接口,它将定时器功能抽象为一个文件描述符:当定时器到期时,该文件描述符会变为可读状态,我们可以通过read操作获取到期次数,从而处理定时事件。 相比传统定时器,timerfd的优势在于: 可以无缝集成到 I/O 多路复用模型中,无需单独的信号处理逻辑 支持绝对时间和相对时间,支持周期性触发 线程安全,可在多线程环境中安全使用 二、定时器类设计(Timerfd.h)我们首先设计一个Timerfd类,封装timerfd的创建、设置、启动、停止等操作,核心思路是通过回调函数处理定时事件。 12345678910111213141516171819202122232425262728293031323334...
警惕 “虚假精通”,守住技术人的核心竞争力
导言在 AI 工具如 Claude、ChatGPT 日益渗透到软件开发全流程的当下,Playtechnique 的《AI Doesn't Lighten the Burden of Mastery》像一剂清醒剂,戳破了 “AI 能帮我们跳过学习、直接掌握技术” 的幻象。文章没有否定 AI 的价值,却直指一个更本质的问题:AI 能生成 “形似” 的优质代码,却无法替我们完成 “理解” 与 “思考” 的核心工作;它能减轻机械性的体力负担,却永远无法替代 “精通” 所需的认知投入。这篇短文让我对 “AI 时代如何做技术” 有了更深刻的反思。 在 C++ 开发领域,AI 工具同样展现出强大的代码生成能力 —— 从类定义、模板函数到 STL 容器用法,甚至多线程同步逻辑,AI 都能快速输出 “形似规范” 的代码。但结合 playtechnique 的观点再看 C++ 开发场景,会发现 “虚假精通” 的陷阱更隐蔽、危害也更大:C++ 的内存管理、指针操作、模板元编程等底层特性,恰恰是 AI 最易出错却最难被察觉的地方。这篇感悟将聚焦 C++ 开发,聊聊如何在借助 AI 提升效率的同时...
通用代码审查清单整理
一、常规功能与可读性(P1+P2) 序号 审查项 判定标准(二元可验证) 优先级 1 功能实现完整性 代码覆盖所有预期需求点(对照需求清单无遗漏,无逻辑错误,如模板特化、重载函数功能符合设计) P1 2 代码易懂性 新接手开发者可在 10 分钟内理解核心逻辑(无过度复杂模板嵌套、晦涩宏定义、无拼音 / 英文混杂命名) P1 3 编码规范符合性 完全匹配团队 C++ 规范(如大括号位置、命名空间使用、const/constexpr正确修饰、缩进无违规) P1 4 冗余代码清理 无重复代码(≥3 行相同逻辑未抽取为函数 / 模板)、无注释掉的无效代码块(如废弃的类成员、未使用的全局函数) P1 5 循环安全性 循环有明确终止条件(无死循环风险),无循环内重计算(如重复获取std::vector长度),无迭代器失效场景(如循环中增删容器元素) P1 6 全局变量 / 对象合理性 无不必要全局变量(可替换为局部变量 / 函数参数),全局对象无初始化顺序依赖风险(如跨文件全局对象相互引用) P2 7 库函数...
Git 冲突规避
导言Git 冲突的本质是并行开发中代码变更的重叠与未及时同步,而非单纯的技术问题。 一、先搞懂:Git 冲突的 3 大核心根源在解决问题前,必须明确冲突的来源,才能针对性预防: 同步滞后:长期在本地分支开发,不与主分支同步,导致累积大量差异(最常见,占冲突总量的 60%+) 范围重叠:多开发者同时修改同一文件的同一代码块(如两个开发者改同一个接口的参数) 管控缺失:无分支规范(如直接在主分支开发)、无提交标准(大提交包含多个功能)、无依赖锁定(package.json 频繁冲突) 二、核心策略 :搭建「零冲突友好型」分支体系分支管理是冲突规避的基石,90% 的高频冲突源于混乱的分支结构。推荐两种经过验证的分支模型,团队需二选一并严格执行。 2.1 选择适配的分支模型根据团队规模和项目类型选择,避免混合使用导致混乱: 分支模型 适用场景 核心分支结构 冲突风险 Git Flow 中大型项目、有固定发版周期 main (生产)+develop (开发)+feature/bugfix/hotfix 低 GitHub Flow 小型项目、敏捷迭代(如 ...
单元测试在软件工程中的核心价值
一、引言:单元测试的定位与行业标准根据IEEE 829 测试文档标准,单元测试是软件测试体系中最底层、最基础的测试层级,聚焦于 “最小可测试单元”(如函数、类、模块)的功能验证。作为软件开发流程的关键环节,单元测试并非 “可选优化项”,而是经过行业实践验证的 “质量保障基础设施”。截至 2025 年,全球 Top 100 科技企业中,97% 已将单元测试纳入强制开发规范,其核心价值体现在技术合理性、风险控制、协作效率等多维度的综合收益。 二、单元测试的五大核心技术价值(附数据支撑)1. 缺陷前置预防:降低修复成本的关键机制缺陷的发现阶段直接决定修复成本。根据IBM 软件工程研究院的研究数据: 需求阶段发现的缺陷,修复成本为 “1x”; 编码阶段(未做单元测试)发现的缺陷,修复成本升至 “5x”; 系统测试阶段发现的缺陷,修复成本达 “10x”; 生产环境发现的缺陷,修复成本高达 “100x-1000x”。 单元测试可在编码阶段直接拦截 60%-70% 的逻辑缺陷,使缺陷修复成本降低 80% 以上。 2. 保障代码可维护性:支撑系统演进的 “安全网”软件系统的长期价值依...
PKGCONF依赖管理内容整理
一、安装与配置:Ubuntu 环境搭建pkgconf 是 pkg-config 的现代替代品,兼容其核心功能且解析速度更快、依赖处理更高效。在 Ubuntu 系统中,需通过官方包管理器完成安装与基础配置,确保工具可正常识别依赖包的 .pc 文件(记录编译链接参数的核心文件)。 1. Ubuntu 下的 pkgconf 安装Ubuntu 官方仓库已预装 pkgconf(通常随开发工具链默认安装),若未安装或需更新,执行以下命令: 基础安装:打开终端,执行sudo apt update && sudo apt install pkgconf,该命令会: 同步 Ubuntu 软件源索引,确保获取最新版本; 安装 pkgconf 主程序及依赖(如 libpkgconf3 库); 自动配置默认 .pc 文件搜索路径(无需手动设置基础路径)。 版本验证:安装后执行pkgconf --version,Ubuntu 20.04 输出约 0.29.2,Ubuntu 22.04 输出约 1.8.1(高版本支持更多特性,如更灵活的依赖过滤);若提示 “command not f...
Linux CMake 自动生成模板:一键清理、零警告编译、多库链接
导言在 Linux 下用 CMake 管理 C++ 项目时,你是否常遇到这些问题:手动写 CMakeLists.txt 繁琐、旧配置文件干扰编译、未使用参数警告刷屏、链接库不知从何下手?本文将带你打造一个「全能型 CMake 自动生成模板」,一键解决上述所有痛点,让项目构建效率翻倍。 一、模板核心功能清单先看这个模板能帮我们做什么,避免重复造轮子: 自动清理旧文件:运行时自动删除 CMake 缓存、旧 Makefile 等冗余文件,杜绝配置冲突 智能扫描源码:递归识别当前目录及子目录下所有.cpp/.cc/.h/.hpp文件,无需手动列文件 零警告编译:默认抑制unused parameter(未使用参数)警告,同时保留关键编译检查 规范输出目录:可执行文件、库文件分别输出到build/bin和build/lib,源码目录不污染源 灵活链接库:预留动态库(.so)和静态库(.a)链接区域,示例清晰 安全项目命名:避免中文 / 特殊字符目录名导致的编译错误,支持手动自定义项目名 二、手把手实现模板脚本整个模...
责任链模式
一、责任链模式原理说明1.1 模式定义根据《大话设计模式》定义,责任链模式(Chain of Responsibility Pattern) 是一种对象行为型模式,它使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 1.2 模式结构责任链模式包含以下核心角色,各角色职责明确且协同工作: 角色名称 核心职责 典型实现方式 抽象处理者(Handler) 定义处理请求的接口,包含抽象处理方法和一个后继连接 抽象类或纯虚函数接口 具体处理者(ConcreteHandler) 实现抽象处理者的接口,判断能否处理当前请求;若能则处理,否则将请求转发给后继者 继承抽象处理者的具体类 客户端(Client) 创建处理链,并向链头的具体处理者提交请求,不关心请求的处理细节和传递过程 主函数或业务逻辑模块 1.3 工作流程客户端创建多个具体处理者对象,按照业务逻辑顺序构建责任链(设置每个处理者的后继者) 客户端将请求发送给责任链的第一个处理者 第一个处理者判断自身是否能处理该请求:...
观察者模式
一、模式核心原理1.1 模式定义观察者模式(Observer Pattern)是一种行为型设计模式,定义了对象间一对多的依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都会自动收到通知并更新。 该模式的核心价值在于解耦被观察者与观察者: 被观察者无需知道具体观察者的类型和实现 观察者可独立添加 / 移除,不影响被观察者核心逻辑 支持事件驱动架构的灵活扩展 1.2 UML 类图结构观察者模式包含四个核心角色: 角色 职责 典型实现 Subject(抽象被观察者) 定义观察者管理接口(注册 / 移除 / 通知) 抽象基类 ConcreteSubject(具体被观察者) 维护状态,状态变化时通知所有观察者 继承 Subject 的具体类 Observer(抽象观察者) 定义更新接口,供被观察者通知时调用 抽象基类 ConcreteObserver(具体观察者) 实现更新接口,处理被观察者的通知 继承 Observer 的具体类 12345678910111213141516+-------...
抽象工厂模式
一、工厂方法模式的局限性工厂方法模式仅能创建单一产品等级结构的对象,当系统需要创建多个相互关联的产品族时,工厂方法模式便显现出明显不足。例如,在开发跨平台 UI 组件时,需要同时创建 Windows 风格的按钮和文本框,以及 macOS 风格的按钮和文本框,这些按钮和文本框分别构成不同的产品族。若使用工厂方法模式,需为每个产品(按钮、文本框)都创建对应的工厂类,会导致类的数量急剧增加,且难以保证同一产品族内产品的一致性。而抽象工厂模式恰好能解决这一问题,它可提供一个接口,用于创建一系列相关或相互依赖的对象,无需指定它们的具体类。 二、抽象工厂模式结构2.1 结构文字描述抽象工厂模式包含四个核心角色: 抽象工厂(Abstract Factory):声明一组用于创建一族产品的方法,每个方法对应一种产品。 具体工厂(Concrete Factory):实现抽象工厂中声明的创建产品的方法,生成具体的产品对象,一个具体工厂对应一个产品族。 抽象产品(Abstract Product):为每种产品声明接口,定义产品的公共方法。 具体产品(Concrete Product):实现抽象产...

