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模式,并聊聊其中的几个关键点. 一,基 ...
随机推荐
- CSS媒体查询及其使用
1.什么是媒体查询 媒体查询可以让我们根据设备显示器的特性(如视口宽度.屏幕比例.设备方向:横向或纵向)为其设定CSS样式,媒体查询由媒体类型和一个或多个检测媒体特性的条件表达式组成.媒体查询中可用于 ...
- css 浮动元素居中
方法一 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- web服务器架构演化及所其技术知识体系(分布式的由来)
文章标题是我自己取的,内容来着百度百科k5665219的一篇回答,觉得讲的很不错就转载过来了. 最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们 ...
- while循环案例
class While05{ public static void main(String[ ]args){ //练习1:使用while循环完成输出1------10中的每个数 /*int i =1; ...
- zabbix 千台服务器自动添加实战
一,模式 zabbix 的自动添加 主机有梁祝方式: 自动发现-----被动模式 由服务端主动发起,Zabbix Server开启发现进程,定时扫描局域网中IP服务器.设备, 自动注册----主动 ...
- BFC --- Block Formatting Context --- 块级格式化上下文
虽然知道块级格式化上下文是什么东西,但要我把这个东西给说清楚,还真的不是一件容易的事儿,所以这篇文章我就要说说清楚到底什么使传说中的BFC,即块级格式化上下文. 一.BFC的通俗理解 通俗的理解 -- ...
- Linux 上安装 weblogic12C (静默安装) (一)
最近负责在linux上安装weblogic,客户说要安装最新的版本,版本号为 12.1.X(12.1.2,12.1.3).开始以为和旧版安装一样,使用控制台的方式,下载bin文件,然后一步步在cons ...
- Linux下Makefile的automake生成全攻略--转
http://www.yesky.com/120/1865620.shtml 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下 ...
- 操蛋的Django model------select_related() 主要用于一对一和一对多
实例: 创建表,表都是一对一,一对多 class Province(models.Model): name = models.CharField(max_length=10) class City(m ...
- 4.net两种交互模式
.net两种交互模式 (1) C/S:客户端(Client)/服务器模式(Server) (2) B/S:浏览器(Browser)/服务器模式(Server) 来自为知笔记(Wiz)