C++设计模式实现--訪问者(Visitor)模式
版权声明:本文为博主原创文章,未经博主同意不得转载。
https://blog.csdn.net/L_Andy/article/details/36896645
一. 訪问者模式
定义:表示一个作用于某对象结构中的各元素的操作。
它你能够在不改变各元素的类的前提下定义作用于这些元素的新操作。
结构例如以下:

二. 举例
如果有一项科学实验,是用来对照两种种子在不同环境下的生长情况。
两种种子。一种是普通的种子(Seed_A),一种是太空运回的种子(Seed_B)。
生长环境,各自是在多雨环境下(Rain_Status),阳光环境下(Sun_Status)等等。
结构例如以下:

代码例如以下:
- //状态
- class Status
- {
- public:
- virtual ~Status() {}
- virtual void VisitSeed_A(Seed* elm) {}
- virtual void VisitSeed_B(Seed* elm) {}
- protected:
- Status() {}
- };
- //下雨状态
- class Rain_Status:public Status
- {
- public:
- Rain_Status() {}
- virtual ~Rain_Status() {}
- //下雨状态下A种子生长的情况
- virtual void VisitSeed_A(Seed* elm)
- {
- cout<<"Rain will visit Seed A..."<<endl;
- }
- //下雨状态下B种子生长的情况
- virtual void VisitSeed_B(Seed* elm)
- {
- cout<<"Rain will visit Seed B..."<<endl;
- }
- };
- //阳光状态
- class Sun_Status:public Status
- {
- public:
- Sun_Status() {}
- virtual ~Sun_Status() {}
- //阳光状态下A种子生长的情况
- virtual void VisitSeed_A(Seed* elm)
- {
- cout<<"Sun will visit Seed A..."<<endl;
- }
- //阳光状态下B种子生长的情况
- virtual void VisitSeed_B(Seed* elm)
- {
- cout<<"Sun will visit Seed B..."<<endl;
- }
- };
- //种子
- class Seed
- {
- public:
- virtual ~Seed() {}
- virtual void Accept(Status* vis) = 0;
- protected:
- Seed() {}
- };
- //种子A,如果为普通种子
- class Seed_A:public Seed
- {
- public:
- Seed_A() {}
- ~Seed_A() {}
- void Accept(Status* vis)
- {
- vis->VisitSeed_A(this);
- }
- };
- //种子B,如果为从太空带回来的种子
- class Seed_B:public Seed
- {
- public:
- Seed_B() {}
- ~Seed_B() {}
- void Accept(Status* vis)
- {
- vis->VisitSeed_B(this);
- }
- };
- //对象结构类,为了对照不同种子
- class ObjectStructure
- {
- private:
- list<Seed*> lseed;
- public:
- //Add
- void Attach(Seed* seed)
- {
- lseed.push_back(seed);
- }
- //Delete
- void Detach(Seed* seed)
- {
- lseed.remove(seed);
- }
- //Show
- void Display(Status* status)
- {
- list<Seed*>::iterator it = lseed.begin();
- for (it; it != lseed.end(); ++it)
- {
- (*it)->Accept(status);
- }
- }
- };
- //測试代码
- int main(int argc,char* argv[])
- {
- ObjectStructure obj;
- //加入要对照的两个种子
- obj.Attach(new Seed_A());
- obj.Attach(new Seed_B());
- //查看各种状态下两个种子的情况
- obj.Display(new Rain_Status());
- //Sun Satte
- obj.Display(new Sun_Status());
- return 0;
- }
三. 说明
1. 首先有一点要明白,就是两种种子不会轻易改变。也就是仅仅有普通和太空种子两种。换句话说就是,数据结构比較稳定。
2. 能够变的是新增的状态。比方添加一个X光下的生成情况,等等。说白了就是。操作集合能够相对自由的演化。
3. 这样的结构的长处是。添加新的操作非常easy。缺点是,添加新的数据结构有点困难,由于你要在每个訪问者里都加入对应的操作。
4. 种子生长图相对于訪问者模式的结构图有例如以下关系:
seed(种子)相当于 element(元素),这个是不怎么变的。
status(状态) 相当于 visitor(訪问者),这个是可变且易变的。
要注意的是,每个訪问者都要对全部的元素(element)进行操作。
5. 其实我们非常少用这样的模式。由于数据结构(element)不变的情况非常少。
C++设计模式实现--訪问者(Visitor)模式的更多相关文章
- JAVA设计模式之 訪问者模式【Visitor Pattern】
一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...
- 《图解设计模式》读书笔记6-1 VISITOR模式
目录 1. Visitor模式简介 2. 示例 2.1 类图 2.2 代码 3. 模式的角色和类图 4. 思路拓展 4.1 双重分发 4.2 开闭原则 4.3 难以增加ConcreteElement角 ...
- 设计模式C++描述----22.访问者(Visitor)模式
一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环 ...
- 通过ssh訪问NAT网络模式虚拟机里的Linux
进入 GuestOS : #/sbin/ifconfig 查看 inet addr : 10.0.2.15 然后到 HostOS 去, 看控制面板, 看网络和共享中心的VirtualBox Host- ...
- 设计模式之十五:訪问者模式(Visitor Pattern)
訪问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式. 据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<De ...
- Java设计模式(三) Visitor(訪问者)模式及多分派场景应用
基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要 ...
- 《Java设计模式》之訪问者模式
訪问者模式是对象的行为模式.訪问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作须要改动的话,接受这个操作的数据结构则能够保持不变. 分派的概念 变量被声明时的类型叫做变量的静态类 ...
- JAVA设计模式之:訪问者模式
訪问者模式: 一个作用于某对象结构中各元素的操作,使你能够在不改变各元素类数据结构的前提下添加作用于这些元素的新操作. 结构对象是訪问者模式必备条件.且这个结构对象必须存在遍历自身各个对象的方法. 适 ...
- 设计模式:基于线程池的并发Visitor模式
1.前言 第二篇设计模式的文章我们谈谈Visitor模式. 当然,不是简单的列个的demo,我们以电商网站中的购物车功能为背景,使用线程池实现并发的Visitor模式,并聊聊其中的几个关键点. 一,基 ...
随机推荐
- maven-javadoc-plugin
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javad ...
- PIE SDK图层树伙伴控件示例
1. 功能简介 TocControl控件的主要作用是显示当前加载的图层有哪些.采用什么样的符号等,目的是使用户对当前加载的数据和结构有一个总体的把握.与之相关联的伙伴控件有MapControl,Pa ...
- linux-lnmp 搭建报错
一, 大概就是 没有php-nysql拓展 yum -y install php-mysql 二, 编辑php.ini php.ini中 添加extension=mysql.so PHP.ini 中找 ...
- c#实现wifi连接器
前言 一般正常情况下都会用windows自带的wifi连接,但是为了给用户更好的体验,或者有时候需要检测wifi状态,还是需要集成到项目中态. 原理 1.微软自带Native Wifi API,不过是 ...
- 3、java内存模型特点
java内存模型是围绕着在并发过程中如何处理原子性,可见性跟有序性这三个问题来建立的.先看一下这三个特性: 1.原子性 由java内存模型来直接保证的原子性变量操作就是上文2中提到的8种基本操作,我们 ...
- 防盗链与springboot代理模式(图片文件转发)
在搭建自己的博客网站的时候,很有可能要引入一些外部图片,毕竟多数人最开始不是在自己的平台上写博客. 因某种需要,搬运自己以前写的博客到自己的网站时,在图片这一步可能会出现问题,无法显示.其中往往就是防 ...
- AI从入门到放弃:CNN的导火索,用MLP做图像分类识别?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:郑善友 腾讯MIG后台开发工程师 导语:在没有CNN以及更先进的神经网络的时代,朴素的想法是用多层感知机(MLP)做图片分类的识别:但 ...
- FZU 2122 ——又见LKity——————【KMP字符串匹配】
Problem 2122 又见LKity Accept: 413 Submit: 1425Time Limit: 1000 mSec Memory Limit : 32768 KB Pr ...
- win7 docker的受难记——exit status 255的终极解决
一 我真的认识到我有很多坏习惯,而这次坏就坏在我老是用Docker Quickstart Terminal,而不直接用cmd. 毕竟Docker Quickstart Terminal看属性就是cmd ...
- 适用于所有页面的基础样式base.css
@charset "UTF-8"; /*css 初始化 */ html, body, ul, li, ol, dl, dd, dt, p, h1, h2, h3, h4, h5, ...