作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、访问者模式是什么?

访问者模式是一种行为型的软件设计模式,表示一个作用于某对象结构中的各元素的操作。使得在不改变各元素类的前提下,能定义作用于这些元素的操作。

该模式适合数据结构相对稳定且算法又易变化的系统。数据结构是被访问者,算法操作相当于访问者。

访问者模式的优点:

  1. 良好扩展性。扩展对元素的操作,只需要添加访问者。
  2. 满足单一职责原则。相关的操作封装为一个访问者,使得访问者职责单一。
  3. 解耦。数据结构自身和作用于它的操作解耦合。

访问者模式的缺点:

  1. 不易增加元素类。每增加一个元素类,访问者的接口和实现都要进行变化。
  2. 违背了依赖倒置原则。访问者依赖的是具体元素而不是抽象元素。
  3. 破坏封装。访问者可以获取被访问元素的细节。

二、访问者模式

2.1 结构图

客户端即Main主函数,对象结构中存放了被访问的元素集合以及遍历各个元素的方法,使得抽象访问者可以依次与具体元素对接,完成访问。

2.2 代码示例

场景描述:市长视察学校和企业。

//Visitor.h
/****************************************************/
#pragma once
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>using namespace std;class Visitor;// 抽象元素类-地点(被访问)
class Place
{
public:// 构造函数Place(string name) : m_name(name) {}// 接受访问virtual void accept(Visitor* visitor) = 0;// 获取名字string getName() {return m_name;}private:string m_name;
};// 具体元素类-学校
class School : public Place
{
public:// 构造函数School(string name) : Place(name) {}// 接受访问virtual void accept(Visitor* visitor);};// 具体元素类-企业
class Enterprise : public Place
{
public:// 构造函数Enterprise(string name) : Place(name) {}// 接受访问virtual void accept(Visitor* visitor);};// 抽象访问者
class Visitor
{
public:// 访问学校virtual void visitSchool(School* school) = 0;// 访问企业virtual void visitEnterprise(Enterprise* enterprise) = 0;};// 具体访问者-市长
class Mayor : public Visitor
{
public:// 访问学校virtual void visitSchool(School* school) {cout << "市长参观了:" << school->getName() << endl;cout << "对老师和学生表达了诚挚的慰问。" << endl;}// 访问企业virtual void visitEnterprise(Enterprise* enterprise) {cout << "市长参观了:" << enterprise->getName() << endl;cout << "对企业的发展表示肯定。" << endl;}};// 访问行为类
class Visiting
{
public:// 添加被访问地点void add(Place* place) {places.push_back(place);}// 删除被访问地点void remove(Place* place) {places.erase(std::remove(places.begin(), places.end(), place), places.end());}// 进行访问void accept(Visitor* visitor) {for (auto place : places) {place->accept(visitor);}}private:std::vector<Place*> places;
};
//Visitor.cpp
/****************************************************/
#include "Visitor.h"// 接受访问
void School::accept(Visitor* visitor) {visitor->visitSchool(this);
}// 接受访问
void Enterprise::accept(Visitor* visitor) {visitor->visitEnterprise(this);
}
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Visitor.h"using namespace std;int main()
{Visiting *visiting = new Visiting();Place *school = new School("东华大学");Place *enterprise = new Enterprise("华为");Visitor *mayor = new Mayor();// 添加被访问对象cout << "首日,";visiting->add(school);visiting->add(enterprise);// 安排市长进行访问visiting->accept(mayor);// 次日行程,删除某个被访问对象后再次访问cout << "次日,";visiting->remove(school);visiting->accept(mayor);// 删除delete visiting;delete school;delete enterprise;delete mayor;visiting = nullptr;school = nullptr;enterprise = nullptr;mayor = nullptr;return 0;
}

程序结果如下。

访问者模式使得访问操作与被访问元素解耦,同样是访问学校和企业,不同的访问者来干的事情和目的是不一样的,而这个不同的内容就可以在访问者类中实现。不过该模式不太适合增加新的元素,就像添加一个新的被访问对象-派出所,那每个访问者都要添加访问派出所的操作,违反了开闭原则。

三、总结

我尽可能用较通俗的话语和直观的代码例程,来表述我对访问者模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解访问者模式。

如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

设计模式之访问者模式(C++)相关推荐

  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. 设计模式复习-访问者模式

    VisitorMode.h#pragma once #include<list> #include<string> #include<iostream> using ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. PHP学习笔记-流程控制语句
  2. Jeff Dean竟在谷歌成众矢之的!开除“论文不合格”AI伦理研究员,被1400名员工批斗...
  3. 标注工具_语料标注工具(2)
  4. web访问hive速度怎么样_使用Hive的web界面:HWI
  5. 【CyberSecurityLearning 41】Linux密码破解以及菜单加密
  6. awk 系列Part5:如何使用 awk 复合表达式
  7. mybatis里mapper.xml中SQL语句if语句嵌套if语句
  8. 10月15日~~大08网络~~本周课外实践
  9. php当前月每天时间戳,php获取当前月与上个月月初及月末时间戳的方法
  10. Xshell批量导入IP地址
  11. python 逻辑回归_不会Python没问题!用Excel实现简单的逻辑回归!
  12. \t\t中国机械工程师资格认证中心及各分中心通讯录
  13. 虚拟机上安装win7系统
  14. 全网最全软件版本号相关内容科普
  15. 数据分析处理之词频统计
  16. 《凤凰项目:一个IT运维的传奇故事》笔记
  17. 最新手机枰测出炉 iPhone X仅仅名列第9名
  18. 火星惊现「神秘入口」?好奇号发现的这道门,玉兔二号看着挺眼熟
  19. M1 mac使用UTM安装kali linux
  20. MATLAB通信系统仿真(二)——数字调制

热门文章

  1. debian系统安装dig和nslookup工具
  2. 入职第一天,HR拿了一个橙子进门说:你的学历不是统招本科,不符合公司要求,给你个橘子,走吧!...
  3. 架构师成长之路(4)--架构师知识体系(方法)
  4. html布局图解,web前端之布局模型详解
  5. 国外可以发外链的网站,外贸网站外链平台
  6. ad中pcb双面板怎么设置_PCB双面板的画法及布线技巧
  7. 给您简单介绍术业进销存管理系统
  8. java有关的论述_中国大学MOOC: 以下有关JAVA线程的论述,正确的是()。
  9. 泛微考勤加班流程,有重复的时间段不让提交
  10. c语言正切值怎么表示,C语言中正切的相关函数总结