Visitor

Intent

Represent an operation to be performed on the elements of an object structure.Visitor lets you define a new operation without changing the classes of the elements
on which it operates.

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// DesignPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <share.h>
#include <list>
#include <memory>#define s std::cout
#define d std::endl;// Visitor Patternclass AssignmentNode;
class VariableRefNode;class NodeVisitor {
public:virtual void visitAssignment(std::shared_ptr<AssignmentNode> n) = 0;virtual void visitVariableRef(std::shared_ptr<VariableRefNode> n) = 0;
};class AssignmentVisitor : public NodeVisitor
{
public:AssignmentVisitor() {}~AssignmentVisitor() {}virtual void visitAssignment(std::shared_ptr<AssignmentNode> n){std::cout << typeid(this).name() << ":"  << "Wa o, nice define a new operation to visit the" << std::endl;std::cout << typeid(this).name() << ":" << "classes of the elements without chinging" << std::endl;}virtual void visitVariableRef(std::shared_ptr<VariableRefNode> n){}
};class VariableRef : public NodeVisitor
{
public:VariableRef() {}~VariableRef() {}virtual void visitAssignment(std::shared_ptr<AssignmentNode> n){}virtual void visitVariableRef(std::shared_ptr<VariableRefNode> n){std::cout << typeid(this).name() << ":" << "Bingo, nice define a new operation to visit the" << std::endl;std::cout << typeid(this).name() << ":" << "classes of the elements without chinging" << std::endl;}
};class Node {
public:virtual void Accept(std::shared_ptr<NodeVisitor> v) {}virtual bool operator==(const Node& a) { return false; }std::string mem_;
};class AssignmentNode : public Node
{
public:AssignmentNode() {mem_ = std::string("AssignmentNode");}AssignmentNode(std::shared_ptr<AssignmentNode>){mem_ = std::string("AssignmentNode");}~AssignmentNode() {}virtual void Accept(std::shared_ptr<NodeVisitor> v){std::cout << typeid(v).name() << std::endl;std::cout << "visit succussefully AssignmentNode" << std::endl;v->visitAssignment(std::shared_ptr<AssignmentNode>(this));}virtual bool operator==(const Node& a){if (a.mem_.compare(mem_) == 0)return true;elsereturn false;}};class VariableRefNode : public Node
{
public:VariableRefNode() {mem_ = std::string("VariableRefNode");}~VariableRefNode() {}virtual void Accept(std::shared_ptr<NodeVisitor> v){std::cout << typeid(v).name() << std::endl;std::cout << "visit succussefully VariableRefNode" << std::endl;v->visitVariableRef(std::shared_ptr<VariableRefNode>(this));}virtual bool operator==(const Node& a){if (a.mem_.compare(mem_) == 0)return true;elsereturn false;}
};class Application
{
public:Application() {node_visitor_a_ = std::make_shared< AssignmentVisitor>();node_visitor_v_ = std::make_shared< VariableRef>();}~Application() {}void createNode(){s << "start work" << dstd::shared_ptr<Node> node = std::make_shared< AssignmentNode>();node_list_.push_back(node);std::shared_ptr<Node> node1 = std::make_shared< VariableRefNode>();node_list_.push_back(node1);}void traverseNode(){for (const auto& item : node_list_){AssignmentNode a_node;VariableRefNode v_node;if ((*item) == a_node){item->Accept(node_visitor_a_);}if ((*item) == v_node){item->Accept(node_visitor_v_);}}}void work(){createNode();traverseNode();}
private:std::list<std::shared_ptr<Node> > node_list_{};std::shared_ptr<NodeVisitor> node_visitor_a_;std::shared_ptr<NodeVisitor> node_visitor_v_;
};int main()
{std::shared_ptr<Application> a = std::make_shared<Application>();a->work();
}

在这里插入图片描述

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

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

相关文章

深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别 计算机竞赛

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

【计算机网络笔记】CIDR与路由聚合

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

CSS特效010:文字颜色渐变的流光效果

查看专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS相关的库、…

C/C++轻量级并发TCP服务器框架Zinx-框架开发002: 定义通道抽象类

文章目录 2 类图设计3 时序图数据输入处理&#xff1a;输出数据处理总流程 4 主要实现的功能4.1 kernel类&#xff1a;基于epoll调度所有通道4.2 通道抽象类&#xff1a;4.3 标准输入通道子类4.4 标准输出通道子类4.5 kernel和通道类的调用 5 代码设计5.1 框架头文件5.2 框架实…

磁带标签设计:Tape Label Studio 2023.11.0.7 Crack

Tape Label Studio&#xff08;磁带标签设计&#xff09; 为标签创建颜色样式。修改标签中使用的每种颜色&#xff0c;包括背景、条形码、边框、文本和字符颜色。自定义边框样式以适合您正在使用的标签。从实心、虚线或虚线边框中进行选择。轻松调整宽度和宽度。Tape Label St…

Python编程-----网络通信

一.统一资源定位器URL 专为标识Internet网上资源位置而设的一种编址方式 ,URL一般由以下几个部分组成&#xff1a; 传输协议://主机IP地址(或域名地址)[:端口号]/资源所在路径和文件名 •传输协议是指访问该资源所使用的访问协议&#xff1b; •主机IP地址&#xff08;或域名…

Leetcode—765.情侣牵手【困难】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—765.情侣牵手 并查集置换环思路 参考自ylb 实现代码 class Solution { public:int minSwapsCouples(vector<int>& row) {int n row.size();int len n / 2;vector<int> p(len);iota(p.begin(), p.…

225.用队列实现栈(LeetCode)

思路 思路&#xff1a;用两个队列实现栈后进先出的特性 &#xff0c;两个队列为空时&#xff0c;先将数据都导向其中一个队列。 当要模拟出栈时&#xff0c;将前面的元素都导入另一个空队列&#xff0c;再将最后一个元素移出队列 实现 实现&#xff1a; 因为C语言没有库可以…

typhonjs-escomplex 代码可读性 可维护度探索

目前市面上的前端代码质量评分中的代码可维护度是大都是基于 typhonjs-escomplex 这个库扫描而来&#xff0c;但是这个库的官方文档并没有介绍相关指标数据的计算规则&#xff0c;不知道规则如何提升指标数据呢&#xff1f;所以本文对 typhonjs-escomplex 源码进行探索&#xf…

C++二分查找算法:最大为 N 的数字组合

涉及知识点 二分查找 数学 题目 给定一个按 非递减顺序 排列的数字数组 digits 。你可以用任意次数 digits[i] 来写的数字。例如&#xff0c;如果 digits [‘1’,‘3’,‘5’]&#xff0c;我们可以写数字&#xff0c;如 ‘13’, ‘551’, 和 ‘1351315’。 返回 可以生成的…

【CASS精品教程】打开cass提示base.dcl未找到文件的解决办法

打开cass 7.1时提示base.dcl未找到文件的解决办法。 文章目录 一、问题描述二、解决办法 一、问题描述 系统上安装了cad2006cass7.1&#xff0c;cass软件可以正常打开&#xff0c;但是在使用屏幕菜单绘制地图时&#xff0c;选择一个工具&#xff0c;提示base.dcl未找到文件&am…

蓝桥杯每日一题2023.11.14

题目描述 题目分析 此题目的最终目标是将字母都填上数使等式符合条件&#xff0c;实际我们发现可以使用搜索将所有符合条件的进行判断&#xff08;答案&#xff1a;29&#xff09; 由于小数可能会出现错误故我们将其进行简单变化进行搜索 #include<bits/stdc.h> using…