VisitorMode.h#pragma once
#include<list>
#include<string>
#include<iostream>
using namespace std;/*
设计模式-访问者模式(Visitor)
表示一个作用于某对象机构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于
这些元素的新操作。
*/class CConcreteElementA;
class CConcreteElementB;class CVisitor {//为该对象结构中ConcreteElement的每个类声明一个Visit操作。
public:virtual void VisitConcreteElementA(CConcreteElementA * pConcreteElementA) = 0;virtual void VisitConcreteElementB(CConcreteElementB * pConcreteElementB) = 0;
};class ConcreteVisitor1 :public CVisitor {//具体访问者类
public:void VisitConcreteElementA(CConcreteElementA * pConcreteElementA);void VisitConcreteElementB(CConcreteElementB * pConcreteElementB);
};class ConcreteVisitor2 :public CVisitor {//具体访问者类
public:void VisitConcreteElementA(CConcreteElementA * pConcreteElementA);void VisitConcreteElementB(CConcreteElementB * pConcreteElementB);
};class CElement {//定义一个Accept操作,它以一个访问者为参数
public:virtual void Accept(CVisitor *pVisitor) = 0;
};class CConcreteElementA :public CElement {
private:string mstrName;
public:CConcreteElementA(const string &strName);void Accept(CVisitor *pVisitor);void OperationA() {}//A的单独方法string GetName();
};class CConcreteElementB :public CElement {
private:string mstrName;
public:CConcreteElementB(const string &strName);void Accept(CVisitor *pVisitor);void OperationB() {}//B的单独方法string GetName();
};class CobjuctStructure {//定义一个高层接口,以允许访问者访问它的元素。
private:list<CElement*>mlElement;
public:CobjuctStructure();~CobjuctStructure();void Attach(CElement *pElement);void Eetach(CElement *pElement);void Accept(CVisitor *pVisitor);
};VisitorMode.cpp
#include "stdafx.h"
#include "VisitorMode.h"void ConcreteVisitor1::VisitConcreteElementA(CConcreteElementA * pConcreteElementA) {cout << "1-A:" << pConcreteElementA->GetName() << endl;
}
void ConcreteVisitor1::VisitConcreteElementB(CConcreteElementB * pConcreteElementB) {cout << "1-B:" << pConcreteElementB->GetName() << endl;
}void ConcreteVisitor2::VisitConcreteElementA(CConcreteElementA * pConcreteElementA) {cout << "2-A:" << pConcreteElementA->GetName() << endl;
}
void ConcreteVisitor2::VisitConcreteElementB(CConcreteElementB * pConcreteElementB) {cout << "2-B:" << pConcreteElementB->GetName() << endl;
}CConcreteElementA::CConcreteElementA(const string &strName) {mstrName = strName;}
void CConcreteElementA::Accept(CVisitor *pVisitor) {pVisitor->VisitConcreteElementA(this);
}
string CConcreteElementA::GetName() {return mstrName;
}CConcreteElementB::CConcreteElementB(const string &strName) {mstrName = strName;}
void CConcreteElementB::Accept(CVisitor *pVisitor) {pVisitor->VisitConcreteElementB(this);
}
string CConcreteElementB::GetName() {return mstrName;
}CobjuctStructure::CobjuctStructure() {mlElement.clear();
}
CobjuctStructure::~CobjuctStructure() {for each(CElement* index in mlElement) {delete index;}
}
void CobjuctStructure::Attach(CElement *pElement) {mlElement.push_back(pElement);
}
void CobjuctStructure::Eetach(CElement *pElement) {mlElement.remove(pElement);
}
void CobjuctStructure::Accept(CVisitor *pVisitor) {for each (CElement * index in mlElement) {index->Accept(pVisitor);}
}客户端调用#include<string>
#include<iostream>
#include "VisitorMode.h"
using namespace std;int main() {CobjuctStructure *pO = new CobjuctStructure();pO->Attach(new CConcreteElementA("man"));pO->Attach(new CConcreteElementB("woman"));ConcreteVisitor1 *pV1 = new ConcreteVisitor1();ConcreteVisitor2 *pV2 = new ConcreteVisitor2();pO->Accept(pV1);pO->Accept(pV2);delete pO, delete pV1, delete pV2;getchar();return 0;
}

设计模式复习-访问者模式相关推荐

  1. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

  2. 北风设计模式课程---访问者模式(Visitor)

    北风设计模式课程---访问者模式(Visitor) 一.总结 一句话总结: 设计模式是日常问题的经验总结方案,所以学好设计模式对日常出现的问题可以有很好的解决. 访问者设计模式有点神似 抽象工厂模式, ...

  3. 设计模式之访问者模式(Visitor)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. 【设计模式】访问者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.访问者模式简介 二.访问者模式 适用场景 三.访问者模式 优缺点 四.访问者模式 与 迭代器模式 五.代码示例 1.Game 父类 ( 被访问者 ) 2.VipGame 收费游戏 ( 被 ...

  5. C++设计模式之访问者模式

    访问者模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的 ...

  6. 设计模式:访问者模式(Vistor)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  7. java的string访问某个元素_C#深究.net常用的23种设计模式之访问者模式(Vistor Pattern)...

    一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式 ...

  8. Android设计模式之——访问者模式

    一.介绍 访问者模式是一种将数据操作与数据结构分离的设计模式,它是<设计模式>中23种设计模式中最复杂的一个,但它的使用频率并不高,正如<设计模式>的作者GOF对访问者模式的描 ...

  9. 设计模式(17) 访问者模式(VISITOR) C++实现

    意图: 表示一个作用于某对象结构的各元素的操作.它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作. 动机: 之前在学校的最后一个小项目就是做一个编译器,当时使用的就是访问者模式. 在静态 ...

最新文章

  1. Java程序员的日常—— Arrays工具类的使用
  2. cgi web 调用多次启动_简单说明CGI和动态请求是什么
  3. Python logging模块详解
  4. 校内模拟赛 Zbq's Music Challenge
  5. Python闭包与javascript闭包比较
  6. Skyline开发1-环境搭建
  7. HTTP协议格式详解(总结)
  8. 国内著名高校飞跃手册整理
  9. 简单了解mouseover与mouseenter的使用场景
  10. 【机器学习】10:朴素贝叶斯做文本分类
  11. Nginx多个域名配置ssl证书出错解决方案
  12. 关于电话电子邮件诈骗的骨感
  13. layUi框架入门篇(一)
  14. Away3d粒子系统位置初始化
  15. 互联网战神谷歌大牛Jeff Dean
  16. 免费的模拟贝斯合成器-Togu Audio Line TAL-Bassline Free WiN-MAC
  17. redis启动报错oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  18. 交了赎金还被“撕票”?这勒索病毒不讲究
  19. Matlab的filtfilt函数解析与C++实现
  20. 2023系统分析师---冲刺高频错题

热门文章

  1. BZOJ 1924 [Sdoi2010]所驼门王的宝藏
  2. 优秀好文收录(持续更新...)
  3. nginx配置location总结及rewrite规则写法
  4. 问题-[Delphi]通过Map文件查找内存地址出错代码所在行
  5. Flask与Ajax
  6. MySQL服务器修改主机名后问题解决
  7. python之装饰器篇
  8. 对软件工程与计算机科学之间区别的看法
  9. iphone开发基础:loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
  10. bzoj 3209 数位DP+欧拉定理