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

【C++】访问者模式

目录

  • 一、模式核心概念与结构
  • 二、C++ 实现示例:文档模型的操作
  • 三、访问者模式的关键特性
  • 四、应用场景
  • 五、访问者模式与其他设计模式的关系
  • 六、C++ 标准库中的访问者模式应用
  • 七、优缺点分析
  • 八、实战案例:图形编辑器的操作
  • 九、实现注意事项
    • 如果这篇文章对你有所帮助,渴望获得你的一个点赞!

访问者模式(Visitor Pattern)是一种【行为型】设计模式,它允许在不改变对象结构的前提下,定义作用于这些对象元素的新操作。这种模式将算法与对象结构分离,通过 “双重分派” 机制实现对不同类型元素的差异化处理,特别适用于需要对复杂对象结构进行多种不相关操作的场景。

一、模式核心概念与结构

访问者模式包含五个核心角色:

  1. 抽象访问者(Visitor):定义对每个具体元素的访问操作接口。
  2. 具体访问者(Concrete Visitor):实现抽象访问者接口,提供具体的操作逻辑。
  3. 抽象元素(Element):定义接受访问者的接口(accept方法)。
  4. 具体元素(Concrete Element):实现接受访问者的接口,通常调用访问者的对应方法。
  5. 对象结构(Object Structure):管理元素集合,提供遍历元素的方式。

二、C++ 实现示例:文档模型的操作

以下是一个文档模型的示例,演示如何使用访问者模式实现不同类型文档元素的操作:

#include <iostream>
#include <string>
#include <memory>
#include <vector>// 前向声明
class Visitor;// 抽象元素
class Element {
public:virtual ~Element() = default;virtual void accept(Visitor& visitor) = 0;
};// 具体元素:文本段落
class TextParagraph : public Element {
private:std::string text;public:TextParagraph(const std::string& content) : text(content) {}std::string getText() const { return text; }void accept(Visitor& visitor) override;
};// 具体元素:图片
class Image : public Element {
private:std::string url;int width;int height;public:Image(const std::string& imgUrl, int w, int h) : url(imgUrl), width(w), height(h) {}std::string getUrl() const { return url; }int getWidth() const { return width; }int getHeight() const { return height; }void accept(Visitor& visitor) override;
};// 抽象访问者
class Visitor {
public:virtual ~Visitor() = default;virtual void visitTextParagraph(TextParagraph& paragraph) = 0;virtual void visitImage(Image& image) = 0;
};// 具体访问者:HTML导出器
class HTMLExportVisitor : public Visitor {
public:void visitTextParagraph(TextParagraph& paragraph) override {std::cout << "<p>" << paragraph.getText() << "<
http://www.dtcms.com/a/265833.html

相关文章:

  • PHP语法基础篇(八):超全局变量
  • 鸿蒙应用开发:从网络获取数据
  • UE5中的AnimNotify
  • KDD 2025 | 地理定位中的群体智能:一个多智能体大型视觉语言模型协同框架
  • rabbitmq 与 Erlang 的版本对照表 win10 安装方法
  • SPLADE 在稀疏向量搜索中的原理与应用详解
  • MCP 传输机制(Streamable HTTP)
  • 多线程知识
  • 21、MQ常见问题梳理
  • 映射阿里云OSS(对象存储服务)
  • [创业之路-467]:企业经营层 - 《营销管理》的主要内容、核心思想以及对创业者的启示
  • 【Spring boot】tomcat Jetty Undertow对比,以及应用场景
  • Qt 事件
  • 医科+AI!和鲸支持南京医科大学医学数据挖掘课程实践教学落地
  • CCLinkIE转EtherCAT:食品产线测厚仪的“精准心跳”如何跳动?
  • 重学React(二):添加交互
  • 运维服务部中级服务工程师面试试题
  • 【Spring篇09】:制作自己的spring-boot-starter依赖1
  • 服务器如何配置防火墙规则开放/关闭端口?
  • ROS2---话题重映射
  • 能生成二维码的浏览器插件来了
  • 模型训练复习
  • RabbitMQ 高级特性之发送方确认
  • 12、jvm运行期优化
  • .Net Core 中RabbitMQ基本使用
  • [自然语言处理]计算语言的熵
  • 【Python办公】Excel转CSV文件(可指定拆分行数\可批量或单个)
  • 用C#编写一个读取磁盘第一扇区的程序
  • 架空线路云台监控系统应对线路故障的智能化解决方案
  • 深度学习中的逻辑回归:从原理到Python实现