读书笔记:c++对话系列,Visitor模式

需要在类体系中加入一个新的虚函数,但不允许改动。
Visitor模式,核心是:将操作作为数据对象传递给类体系预留的Accept函数。

class Personnel{
public:virtual void Pay () = 0;virtual void Promote() = 0;virtual void Accept(Visitor &) = 0;
};
class Officer : public Personnel { /* 改写虚拟函数 */ };
class Captain : public Officer { /* 改写虚拟函数 */ };
class First : public Officer { /* 改写虚拟函数 */ };

Visitor模式:行为型设计模式。允许为对象结构的元素添加进一步的操作,而不必修改这些元素的类。以下为示例:

class Element {
public:virtual ~Element() {}virtual void accept(class Visitor &v) = 0;
};
class ConcreteElementA : public Element {
public:void accept(Visitor &v) override{v.visit(*this);}void operationA() {std::cout << "Element A operation." << std::endl;}
};
class ConcreteElementB : public Element {
public:void accept(Visitor &v) override{v.visit(*this);}void operationB() {std::cout << "Element B operation." << std::endl;}
};
class Visitor {
public:virtual ~Visitor() {}virtual void visit(ConcreteElementA &element) = 0;virtual void visit(ConcreteElementB &element) = 0;
};
class ConcreteVisitor : public Visitor {
public:void visit(ConcreteElementA &element) override {element.operationA();std::cout << "Visited by ConcreteVisitor." << std::endl;}void visit(ConcreteElementB &element) override {element.operationB();std::cout << "Visited by ConcreteVisitor." << std::endl;}
};
class NewOperationVisitor : public Visitor { //这个就是新增的操作范例
public:void visit(ConcreteElementA &element) override {std::cout << "New operation visited Element A." << std::endl;}void visit(ConcreteElementB &element) override {std::cout << "New operation visited Element B." << std::endl;}
};
int main() {ConcreteElementA elementA;ConcreteElementB elementB;ConcreteVisitor visitor;    //原操作elementA.accept(visitor);elementB.accept(visitor);NewOperationVisitor newOperationVisitor;//这个就是新增的操作范例elementA.accept(newOperationVisitor);elementB.accept(newOperationVisitor);return 0;
}

以下为改写前面的代码

class Visitor {
public:virtual void Visit( Personnel& ) = 0;virtual void Visit( Officer& ) = 0;virtual void Visit( Captain& ) = 0;virtual void Visit( First& ) = 0;
};
void Personnel::Accept( Visitor & v ) { v.Visit( *this ); } 
void Officer::Accept ( Visitor & v ) { v.Visit( *this ); } 
void Captain::Accept ( Visitor & v ) { v.Visit( *this ); } 
void First::Accept ( Visitor & v ) { v.Visit( *this ); } 
class DoSomething : public Visitor {
public:virtual void Visit( Personnel& );virtual void Visit( Officer& );virtual void Visit( Captain& );virtual void Visit( First& );
};
void DoSomething::Visit( Captain& c ){if( femaleGuestStarIsPresent )c.TurnOnCharm();elsec.StartFight();
}
void DoSomething::Visit( First& f ){f.RaiseEyebrowAtCaptainsBehavior();
}
void f( Personnel& p ){p.Accept( DoSomething() );
}
int main(){Captain k;First s;f( k );f( s );
}

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

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

相关文章

缓冲channel和限制goroutine并发数

文章目录 3.7.1 用作计数信号量3.7.2 使用缓存channelsync.WaitGroup限制并发数&#xff08;类似上小节&#xff09; 要限制住goroutine的并发, 一定要阻塞住main的goroutine! 一定要阻塞住main的goroutine! 一定要阻塞住main的goroutine! 可以看最后一个例子。 由于带缓冲cha…

尚未解决:use_python()和use_virtualenv()的使用

reticulate包为Python和R之间的互操作性提供了一套全面的工具。该包包含以下功能&#xff1a; 以多种方式从R调用Python&#xff0c;包括RMarkdown、获取Python脚本、导入Python模块以及在R会话中交互使用Python。 R和Python对象之间的转换&#xff08;例如&#xff0c;R和Pan…

2023年中国调音台产业链、产量及市场规模分析[图]

调音台是一种专业音频设备&#xff0c;用于混音、处理和控制音频信号。它通常用于音乐制作、现场演出、录音室以及广播等场景中。调音台允许用户调整不同声音来源的音频信号&#xff0c;使其在混音过程中达到理想的音质和平衡。调音台按信号出来方式可分为&#xff1a;模拟式调…

UVa10976 Fractions Again?!(分数拆分)

1、题目 2、题意 输入正整数 k k k&#xff0c;找到所有正整数 x ≥ y x \ge y x≥y&#xff0c;使得 1 k 1 x 1 y \frac{1}{k} \frac{1}{x} \frac{1}{y} k1​x1​y1​。 3、分析 既然要求找出所有的 x , y x,y x,y&#xff0c;枚举对象自然是 x , y x,y x,y了。可…

LeetCode每日一题——2558. Take Gifts From the Richest Pile

文章目录 一、题目二、题解 一、题目 2558. Take Gifts From the Richest Pile You are given an integer array gifts denoting the number of gifts in various piles. Every second, you do the following: Choose the pile with the maximum number of gifts. If there …

名词解释 MongoDB

MongoDB 是一个面向文档的数据库管理系统&#xff0c;它不使用传统的表格结构&#xff0c;而是将数据组织成类似文档的形式&#xff0c;通常使用JSON格式。 文档数据库&#xff1a;数据以文档的形式存储&#xff0c;每个文档可以包含不同的字段&#xff0c;就像一个文件可以包…

day36(http协议 服务器软件的使用 PHP的简单了解 前后端交互 ajax 同步和异步)

一.http协议 1.http1&#xff09;前后端交互&#xff1a;前端发数据给后端&#xff0c;后端获取前端数据&#xff0c;经过解析&#xff0c;返回需要的数据2&#xff09;数据如何交互&#xff1f;请求响应3&#xff09;概念&#xff1a;http&#xff08;超文本传输协议&#xf…

C# 基于腾讯云人脸核身和百度云证件识别技术相结合的 API 实现

目录 腾讯云人脸核身技术 Craneoffice.net 采用的识别方式 1、活体人脸核身(权威库)&#xff1a; 2、活体人脸比对&#xff1a; 3、照片人脸核身(权威库)&#xff1a; 调用成本 百度云身份证识别 调用成本 相关结合点 核心代码 实现调用人脸核身API的示例 实现调用身…

拓世大模型 | 立足行业所需,发力终端,缔造智能无限可能

蒸汽机的发明为人类工业革命揭开序幕&#xff0c;引领了近现代产业变革。众所周知&#xff0c;而今AI技术的革命性突破&#xff0c;站在了时代舞台的中心&#xff0c;特别是大模型的崛起&#xff0c;无疑是第四次产业革命的焦点&#xff0c;它的地位可与当年的“蒸汽机”相提并…

性能诊断工具对比+Prometheus(普罗米修斯)监控系统学习

【精选】Prometheus&#xff08;普罗米修斯&#xff09;监控系统_普罗米修斯监控_愿许浪尽天涯的博客-CSDN博客 Java 性能诊断工具 &#x1f3cd;️... Java自带的工具 JConsoleJVisualVMjmapjstackjcmd单机图形化诊断工具 YourKitJProfilerVisualVMArthas分布式诊断工具 Zipk…

Jenkins发布windows服务器jar

一、背景 之前是linux服务器部署的项目&#xff0c;现在转为windows服务器部署。jenkins和git都已经部署好了。所以本文只会重点讲Jenkins调用windows服务器bat命令及bat命令的编写概况。 二、详情操作 1、Jenkins调用windows bat文件 首先在Jenkins项目配置"高级项目选…

【git命令】删除分支

1. 删除本地分支 使用git branch -d命令删除本地分支 git branch -d branch_name其中&#xff0c;branch_name是分支名。如果有未合并的更改&#xff0c;Git会阻止你删除分支。 使用git branch -D命令强制删除本地分支 git branch -D branch_name这个命令会强制删除分支&am…

JAVA排序

目录 再看各种排序前我们先了解一下什么叫 稳定性 插入排序&#xff1a; 希尔排序:(插入排序的优化) 测试插入排序和希尔排序(插入排序的优化)排序时间对比 选择排序: 选择排序的优化: 正确的 选择排序优化 快速排序(挖坑法:未优化) 快速排序的优化1 快速排序优化2 优化快速排序…

mysql4

创建表并插入数据&#xff1a; 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 primary key name VARCHAR(50) 否 否 是 否 否 not null glass VARCHAR(50) 否 否 是 否 否 not nullsch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun …

3.无重复字符的最长子串

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 滑动窗口。使用哈希集合来记录窗口中的字符。当窗口右边界不为字符串右边界时&#xff0c;窗口右边界右移一位&#…

小型k8s

参考&#xff1a; 用于本地实验的小型 Kubernetes&#xff1a;k0s、MicroK8s、kind、k3s 和 Minikube - 知乎 https://www.cnblogs.com/jesse123/p/15559614.html K3s vs K8s&#xff1a;轻量级和全功能的对决_运行_部署_容器

server2012 通过防火墙开启局域网内限定IP进行远程桌面连接

我这里需要被远程桌面的电脑系统版本为windows server2012 1、打开允许远程连接设置 2、开启防火墙 3、设置允许“远程桌面应用”通过防火墙 勾选”远程桌面“ 3、入站规则设置 高级设置→入站规则→远程桌面-用户模式(TCP-In) 进入远程桌面属性的作用域——>远程IP地址—…

实体店做商城小程序如何

互联网电商深入各个行业&#xff0c;传统线下店商家无论产品销售还是服务业&#xff0c;仅靠以往的经营模式&#xff0c;很难拓展到客户&#xff0c;老客流失严重&#xff0c;同时渠道单一&#xff0c;无法实现外地客户购物及线上客户赋能等。 入驻第三方平台有优势但也有不足…

聊聊springboot的TomcatMetricsBinder

序 本文主要研究一下springboot的TomcatMetricsBinder TomcatMetricsAutoConfiguration org/springframework/boot/actuate/autoconfigure/metrics/web/tomcat/TomcatMetricsAutoConfiguration.java Configuration(proxyBeanMethods false) ConditionalOnWebApplication C…

pinia全局状态管理

使用&#xff1a;结合vue2、vue3使用 优点&#xff1a;相比vuex&#xff1a;提供组合式和选项式的写法&#xff0c;支持ts类型推断&#xff0c;提供更简洁的状态管理&#xff08;去除mutation&#xff09; 注意点&#xff1a; &#xff08;1&#xff09;使用store时不要结构&am…