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模式,并聊聊其中的几个关键点. 一,基 ...
随机推荐
- 深入应用C++11:代码优化与工程级应用》勘误表
https://www.cnblogs.com/qicosmos/p/4562174.html
- Oracle RAC集群添加节点
一,节点环境 所有节点分发/etc/hosts,这里我添加两个节点,一个是上次删除的节点,另一个是什么都没有的节点,尝试添加 服务器介绍什么的都在这hosts文件了,大家自己琢磨下 [grid@nod ...
- 超级详细全截图化VMware 安装ubantu
一,下载镜像 由于ubantu时国外源所以下载十分的缓慢 这里我用清华源下载:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/18.10/ub ...
- eclipse中注释快捷键
手动注释: ①类注释:Shift+Alt+J ②方法注释:在方法上方输入/** 后点击回车 自动注释:点击菜单栏上的Window -->Preferences-->Java-->Co ...
- 【计算机网络】SSL交互和握手过程
SSL消息按如下顺序发送: 1.Client Hello 客户发送服务器信息,包括它所支持的密码组.密码组中有密码算法和钥匙大小: 2.Server Hello 服务器选择客户和服务器都支持的密 ...
- Find command usage in Linux with excellent examples--reference
http://www.coolcoder.in/2014/02/find-command-usage-in-linux-with.html find searches the directory tr ...
- jQuery 菜单小练习(实现点击和移动鼠标效果)
这个代码的练习是点击事件后 如何用jQuery联动的方式找到相关标签 实现的结果是点击菜单一或者菜单二等 会出现相关菜品,并隐藏其他菜品.鼠标移动才菜品上会在右侧框内出现相关菜品的价格.实现特殊的效果 ...
- e.target和e.event和event.srcElement
e.target 是目标对象,e.event是目标所发生的事件,event.srcElement捕获当前事件作用的对象 1. $(function(){ $("li:has(ul)" ...
- mysql安装与使用
一.Mysql官方下载地址:https://www.mysql.com/downloads/ 二.下载 Community Server,这个版本是完全免费的 https://dev.mysql.c ...
- MySQL 查询多张表中相同字段的最大值
MySql : 有N张表,N未知,每张表都有一个字段(id),每张表的字段结构不完全一样,如何查询所有表里面所有id的最大值?如下图所示: 对上面三张表进行操作的话,结果应该为:9 SQL语句: se ...