大话设计模式之访问者模式

news2025/3/14 22:47:28

访问者模式是一种行为设计模式,它允许你在不修改对象结构的前提下定义作用于这些对象结构元素的新操作。

在访问者模式中,有两个核心概念:

  1. 访问者(Visitor):定义了对对象结构中每个元素的访问操作。每个访问者都会实现对应于对象结构中每个类的访问方法,通过这些方法可以对对象结构中的元素进行不同的操作。

  2. 元素(Element):定义了接受访问者的接口,通常包含一个 accept 方法,该方法接受一个访问者作为参数,然后调用访问者的相应方法来执行操作。

通过访问者模式,可以在不改变元素的类的前提下,定义新的操作,以及对元素进行不同的操作组合。这种模式通常适用于对对象结构中的元素进行复杂操作的场景,例如编译器的语法树遍历、文档对象模型(DOM)的操作等。

#include <iostream>
#include <vector>

// 前向声明访问者类
class Visitor;

// 元素接口
class Element {
public:
    virtual void accept(Visitor& visitor) = 0;
};

// 具体元素类A
class ConcreteElementA : public Element {
public:
    void accept(Visitor& visitor) override;
    void operationA() {
        std::cout << "Operation A performed on ConcreteElementA" << std::endl;
    }
};

void ConcreteElementA::accept(Visitor& visitor) {
    visitor.visitConcreteElementA(*this);
}

// 具体元素类B
class ConcreteElementB : public Element {
public:
    void accept(Visitor& visitor) override;
    void operationB() {
        std::cout << "Operation B performed on ConcreteElementB" << std::endl;
    }
};

void ConcreteElementB::accept(Visitor& visitor) {
    visitor.visitConcreteElementB(*this);
}

// 访问者接口
class Visitor {
public:
    virtual void visitConcreteElementA(ConcreteElementA& elementA) = 0;
    virtual void visitConcreteElementB(ConcreteElementB& elementB) = 0;
};

// 具体访问者类
class ConcreteVisitor : public Visitor {
public:
    void visitConcreteElementA(ConcreteElementA& elementA) override {
        elementA.operationA();
    }

    void visitConcreteElementB(ConcreteElementB& elementB) override {
        elementB.operationB();
    }
};

int main() {
    // 创建具体元素对象
    ConcreteElementA elementA;
    ConcreteElementB elementB;

    // 创建访问者对象
    ConcreteVisitor visitor;

    // 对元素对象应用访问者
    elementA.accept(visitor);
    elementB.accept(visitor);

    return 0;
}

/*
在这个示例中,我们定义了两个具体元素类 ConcreteElementA 和 ConcreteElementB,
它们都实现了元素接口 Element 中的 accept 方法。
然后我们定义了访问者接口 Visitor,其中包含了对每种具体元素的访问方法。
最后,我们定义了一个具体访问者类 ConcreteVisitor,它实现了对具体元素的访问方法。

在 main 函数中,我们创建了具体元素对象 elementA 和 elementB,以及访问者对象 visitor。
然后我们通过调用元素对象的 accept 方法来应用访问者,从而执行相应的操作。
*/

觉得有帮助的话,打赏一下呗。。

           

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

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

相关文章

STM32的GPIO端口的八种模式解析

目录 STM32的GPIO端口的八种模式解析 一、上拉输入模式 二、下拉输入模式 三、浮空输入模式 四、模拟输入模式 五、推挽输出模式 六、开漏输出模式 七、复用推挽输出模式 八、复用开漏输出模式 STM32的GPIO端口的八种模式解析 在学习STM32的过程中&#xff0c;GPIO端口…

惨痛教训:我的专业赢得了辩论,却用情商丢掉了客户。

某一年&#xff0c;我给某市级部门做了一个3D展示的系统&#xff0c;时间紧&#xff0c;任务重&#xff0c;也是如期完成了。最后到市里去评审的时候&#xff0c;现场来了11个副主任&#xff0c;大家你一言我一语的对系统提出意见和建议。 那个时候我是年轻气盛&#xff0c;知道…

CPLD可运行的最高频率是多少

CPLD可运行的最高频率是多少 AG32 内置CPLD的可运行最高频率 AG32 内置CPLD的可运行最高频率 AG32 MCU 的运行最高频率是248M。而CPLD中没有标准的最高频率。 最大能跑多少MHz&#xff0c;取决于cpld 里的设计。 如果是逻辑电路&#xff0c;则不存在时钟的概念。 如果是时序电路…

无线测温技术在高炉炉壳温度检测中的应用/无线测温监控系统

安科瑞薛瑶瑶18701709087 摘要:应用方便灵活的无线测温和热成像技术对高炉炉壳进行检测&#xff0c;利用热成像进行检测&#xff0c;发现了温度异常区域后对关注部位进行点的检测&#xff0c;预防炉壳的烧穿&#xff0c;对温度数据采集及存储&#xff0c;通过查看历史趋势来对…

【Linux】进程的优先级环境变量

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 进程的优先级2.1 什么是优先级2.2 为什么要有优先级2.3 优先级的查看方式2.4 对优先级调整 3. 命令行参数4. 环境变量4.1 环境变量与配置文件4.1.1 环境变量初步介绍4.1.2 配置文件 4.2 更多环境变量4.3 整…

HTTPS 加密解密大致流程

HTTPS简介 在我们开始配置之前&#xff0c;让我们先了解一下HTTPS和它的重要性。 为什么选择HTTPS&#xff1f; 加密传输&#xff1a;通过SSL/TLS协议&#xff0c;确保数据在传输过程中不被窃听。认证身份&#xff1a;确保客户端与预期的服务器通信&#xff0c;防止中间人攻…

密码学 | 椭圆曲线数字签名方法 ECDSA(下)

目录 10 ECDSA 算法 11 创建签名 12 验证签名 13 ECDSA 的安全性 14 随机 k 值的重要性 15 结语 ⚠️ 原文&#xff1a;Understanding How ECDSA Protects Your Data. ⚠️ 写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留着学习。同时&#xff0c;经过几…

00 【哈工大_操作系统】Bochs 汇编级调试方法及指令

本文将介绍一下哈工大李治军老师《操作系统》课程在完成Lab时所使用到的 Bochs 调试工具的使用方法。这是一款汇编级调试工具&#xff0c;打开调试模式非常简单&#xff0c;只需在终端下输入如下指令&#xff1a; 1、bochs 调试基本指令大全 功能指令举例在某物理地址设置断点…

LED电子显示屏的性能要求

LED电子显示屏作为一种重要的信息传播媒介&#xff0c;在各行各业得到广泛应用。然而&#xff0c;其性能要求直接影响到其稳定运行和有效传播信息的效果。以下是LED电子显示屏的性能要求概述&#xff1a; 1. 发光体可靠性 LED电子显示屏的发光体质量必须可靠稳定&#xff0c;保…

云安全与网络安全:有什么区别?

云计算已经存在了一段时间&#xff0c;但某些术语的正确含义仍然存在混乱。一个例子是区分云安全与网络安全。 首先&#xff0c;让我们看一下网络安全一词 &#xff0c;以了解它的含义。然后&#xff0c;我们将将该术语与云安全进行比较&#xff0c;以了解两者在几个关键领域的…

STM32笔记---CAN采样点设置和报错

STM32笔记---CAN采样点设置和报错 采样点设置再同步补偿宽度&#xff08;SJW&#xff09;设置 报错分析CAN中断使能寄存器CAN错误状态寄存器 采样点设置 以前配置CAN参数的BS1和BS2参数时认为总线波特率符合要求就可以了&#xff0c;其实同一个波特率可能对应多组参数设置的情…

vue3 el-table无表头

需要实现的样式 父组件 <template><div><!-- 表格组件 无表头 --><Table :label"tableData.label" :data"tableData.data" :querydata"tableData.querydata" :queryTitle"tableData.title"><template #o…

矩阵起源招聘进行时,寻找发光的你~

推荐有礼&#xff01;添加MO小助理 MO定制书包轻松GET~

Linux查看进程

Linux查看进程 引言查看进程1.快速查看运行中的进程列表2. 查看所有用户的所有进程3.显示所有进程的完整格式。4.动态显示进程的信息5.根据进程名查找进程ID6.以树状图的方式显示进程间的父子关系7.查找指定名字的进程id 引言 Linux查看进程在日常的使用中比较常见&#xff0c…

Sony Camera Remote SDK在Windows上的使用

Sony官方提供了相机遥控软件开发包&#xff0c;允许用户自行开发应用软件&#xff0c;实现对相机的远程控制&#xff0c;包括拍摄、监看和文件传输等。截至目前最新的版本是2024.4.12发布的1.12.00版本&#xff0c;下载链接如下&#xff1a;Camera Remote SDK | LICENSE AGREEM…

直流充电桩与交流充电桩有哪些区别,如何选最靠谱?

在当今快速发展的电动汽车市场&#xff0c;正确选择充电桩成为了车主们面临的重要问题之一。直流充电桩与交流充电桩区到底有什么区别&#xff1f;哪些方面不同&#xff1f;分别适用场景是什么&#xff1f;不同场景应该怎么选&#xff1f;本文一文为您详解。 一、直流充电桩与交…

wps使用Latex编辑公式没有Latex formula

wps使用Latex编辑公式没有Latex formula 1. 下载CTEX2. 下载LaTeXEE3. 配置Miktex4. 配置latexee5. 用管理员权限运行latexeqedit.exe6. wps插入latex公式 1. 下载CTEX 下载CTEX网址&#xff0c;我下载的下图这个&#xff0c;下载完了之后运行exe文件安装ctex。 2. 下载LaTe…

雷达智能名片小程序源码系统 带完整的安装代码包以及搭建教程

在数字化高速发展的今天&#xff0c;名片作为商务交流中的一张“金名片”&#xff0c;其形式与功能也在不断地迭代升级。雷达智能名片小程序源码系统应运而生&#xff0c;为企业和个人提供了一个全新的、智能化的名片展示与互动平台。本文将对雷达智能名片小程序源码系统的开发…

初级软件测试常见问题

1.JMeter &#xff08;1&#xff09;在http请求的时候&#xff0c;消息体数据中的数据需要用{}和“”标记起来&#xff0c;变量要用${}括起来。 &#xff08;2&#xff09;在响应断言的时候&#xff0c;要根据测试模式输出的内容来改变测试字段&#xff0c;假如输出错误可以把…

谷歌浏览器的开发者插件vue-devtools

在这里我留下一个git地址用来下载插件包&#xff0c;首先在自己喜欢的位置创建一个新的文件夹&#xff0c;起一个自己喜欢的文件夹名字&#xff0c;下载到包后&#xff0c;然后点进文件夹里下载依赖&#xff0c;npm install,下载后如下面这个样子 git clone https://gitee.com…