版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/L_Andy/article/details/36896645

一. 訪问者模式

定义:表示一个作用于某对象结构中的各元素的操作。

它你能够在不改变各元素的类的前提下定义作用于这些元素的新操作。

结构例如以下:

二. 举例

如果有一项科学实验,是用来对照两种种子在不同环境下的生长情况。

两种种子。一种是普通的种子(Seed_A),一种是太空运回的种子(Seed_B)。

生长环境,各自是在多雨环境下(Rain_Status),阳光环境下(Sun_Status)等等。

结构例如以下:

代码例如以下:

  1. //状态  
  2. class Status  
  3. {  
  4. public:  
  5.     virtual ~Status() {}  
  6.       
  7.     virtual void VisitSeed_A(Seed* elm) {}  
  8.   
  9.     virtual void VisitSeed_B(Seed* elm) {}  
  10.   
  11. protected:  
  12.     Status() {}  
  13. };   
  14.   
  15. //下雨状态  
  16. class Rain_Status:public Status  
  17. {  
  18. public:  
  19.     Rain_Status() {}  
  20.       
  21.     virtual ~Rain_Status() {}  
  22.       
  23.     //下雨状态下A种子生长的情况  
  24.     virtual void VisitSeed_A(Seed* elm)  
  25.     {  
  26.         cout<<"Rain will visit Seed A..."<<endl;  
  27.     }  
  28.       
  29.     //下雨状态下B种子生长的情况  
  30.     virtual void VisitSeed_B(Seed* elm)  
  31.     {  
  32.         cout<<"Rain will visit Seed B..."<<endl;  
  33.     }  
  34. };   
  35.   
  36. //阳光状态  
  37. class Sun_Status:public Status  
  38. {  
  39. public:  
  40.     Sun_Status() {}  
  41.       
  42.     virtual ~Sun_Status() {}  
  43.       
  44.     //阳光状态下A种子生长的情况  
  45.     virtual void VisitSeed_A(Seed* elm)  
  46.     {  
  47.         cout<<"Sun will visit Seed A..."<<endl;  
  48.     }  
  49.       
  50.     //阳光状态下B种子生长的情况  
  51.     virtual void VisitSeed_B(Seed* elm)  
  52.     {  
  53.         cout<<"Sun will visit Seed B..."<<endl;  
  54.     }  
  55. };  
  56.   
  57.   
  58.   
  59. //种子  
  60. class Seed  
  61. {  
  62. public:  
  63.     virtual ~Seed() {}  
  64.     virtual void Accept(Status* vis) = 0;  
  65.   
  66. protected:  
  67.     Seed() {}  
  68. };  
  69.   
  70. //种子A,如果为普通种子  
  71. class Seed_A:public Seed  
  72. {  
  73. public:  
  74.     Seed_A() {}  
  75.       
  76.     ~Seed_A() {}  
  77.       
  78.     void Accept(Status* vis)  
  79.     {  
  80.         vis->VisitSeed_A(this);  
  81.     }  
  82. };   
  83.   
  84. //种子B,如果为从太空带回来的种子  
  85. class Seed_B:public Seed  
  86. {  
  87. public:  
  88.     Seed_B() {}  
  89.     ~Seed_B() {}  
  90.       
  91.     void Accept(Status* vis)  
  92.     {  
  93.         vis->VisitSeed_B(this);  
  94.     }  
  95. };  
  96.   
  97.   
  98. //对象结构类,为了对照不同种子  
  99. class ObjectStructure  
  100. {  
  101. private:  
  102.     list<Seed*> lseed;  
  103.   
  104. public:  
  105.     //Add  
  106.     void Attach(Seed* seed)  
  107.     {  
  108.         lseed.push_back(seed);  
  109.     }  
  110.   
  111.     //Delete  
  112.     void Detach(Seed* seed)  
  113.     {  
  114.         lseed.remove(seed);  
  115.     }  
  116.   
  117.     //Show  
  118.     void Display(Status* status)  
  119.     {  
  120.         list<Seed*>::iterator it = lseed.begin();  
  121.           
  122.         for (it; it != lseed.end(); ++it)  
  123.         {  
  124.             (*it)->Accept(status);  
  125.         }  
  126.     }  
  127. };  
  128.   
  129.   
  130. //測试代码  
  131. int main(int argc,char* argv[])  
  132. {  
  133.     ObjectStructure obj;  
  134.       
  135.     //加入要对照的两个种子  
  136.     obj.Attach(new Seed_A());  
  137.     obj.Attach(new Seed_B());  
  138.   
  139.     //查看各种状态下两个种子的情况  
  140.     obj.Display(new Rain_Status());  
  141.       
  142.     //Sun Satte  
  143.     obj.Display(new Sun_Status());  
  144.   
  145.     return 0;  
  146. }  

三. 说明

1. 首先有一点要明白,就是两种种子不会轻易改变。也就是仅仅有普通和太空种子两种。换句话说就是,数据结构比較稳定。

2. 能够变的是新增的状态。比方添加一个X光下的生成情况,等等。说白了就是。操作集合能够相对自由的演化。

3. 这样的结构的长处是。添加新的操作非常easy。缺点是,添加新的数据结构有点困难,由于你要在每个訪问者里都加入对应的操作。

4. 种子生长图相对于訪问者模式的结构图有例如以下关系:

seed(种子)相当于 element(元素),这个是不怎么变的。

status(状态) 相当于 visitor(訪问者),这个是可变且易变的。

要注意的是,每个訪问者都要对全部的元素(element)进行操作。

5. 其实我们非常少用这样的模式。由于数据结构(element)不变的情况非常少。

C++设计模式实现--訪问者(Visitor)模式的更多相关文章

  1. JAVA设计模式之 訪问者模式【Visitor Pattern】

    一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...

  2. 《图解设计模式》读书笔记6-1 VISITOR模式

    目录 1. Visitor模式简介 2. 示例 2.1 类图 2.2 代码 3. 模式的角色和类图 4. 思路拓展 4.1 双重分发 4.2 开闭原则 4.3 难以增加ConcreteElement角 ...

  3. 设计模式C++描述----22.访问者(Visitor)模式

    一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环 ...

  4. 通过ssh訪问NAT网络模式虚拟机里的Linux

    进入 GuestOS : #/sbin/ifconfig 查看 inet addr : 10.0.2.15 然后到 HostOS 去, 看控制面板, 看网络和共享中心的VirtualBox Host- ...

  5. 设计模式之十五:訪问者模式(Visitor Pattern)

    訪问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式. 据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<De ...

  6. Java设计模式(三) Visitor(訪问者)模式及多分派场景应用

    基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要 ...

  7. 《Java设计模式》之訪问者模式

    訪问者模式是对象的行为模式.訪问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作须要改动的话,接受这个操作的数据结构则能够保持不变. 分派的概念 变量被声明时的类型叫做变量的静态类 ...

  8. JAVA设计模式之:訪问者模式

    訪问者模式: 一个作用于某对象结构中各元素的操作,使你能够在不改变各元素类数据结构的前提下添加作用于这些元素的新操作. 结构对象是訪问者模式必备条件.且这个结构对象必须存在遍历自身各个对象的方法. 适 ...

  9. 设计模式:基于线程池的并发Visitor模式

    1.前言 第二篇设计模式的文章我们谈谈Visitor模式. 当然,不是简单的列个的demo,我们以电商网站中的购物车功能为背景,使用线程池实现并发的Visitor模式,并聊聊其中的几个关键点. 一,基 ...

随机推荐

  1. es6 Null 传导运算符

    Null 传导运算符 程实务中,如果读取对象内部的某个属性,往往需要判断一下该对象是否存在.比如,要读取message.body.user.firstName,安全的写法是写成下面这样. const ...

  2. python 爬虫系列09-selenium+拉钩

    使用selenium爬取拉勾网职位 from selenium import webdriver from lxml import etree import re import time from s ...

  3. 图解 TCMalloc

    https://zhuanlan.zhihu.com/p/29216091 图解 TCMalloc hellocode 永远年轻   693 人赞了该文章 前言 TCMalloc 是 Google 开 ...

  4. 常用css搜集

    div居中显示 position: fixed; top: 130px; left:0px;right:0px;margin-left:auto;margin-right:auto;

  5. k8s单节点集群部署应用

    之所以用k8s来部署应用,就是因为k8s可以灵活的控制集群规模,进行扩充或者收缩.生产上我们要配置的参数较多,命令行的方式显然不能满足需求,我们应该使用基于配置文件的方式.接下来做一个部署的demo: ...

  6. 关于Javascript模块化和命名空间管理的问题说明

    最近闲下来的时候,稍微想了想这个问题.关于Javascript模块化和命名空间管理 [关于模块化以及为什么要模块化] 先说说我们为什么要模块化吧.其实这还是和编码思想和代码管理的便利度相关(没有提及名 ...

  7. 深入理解JavaScript系列(16):闭包(Closures)

    介绍 本章我们将介绍在JavaScript里大家经常来讨论的话题 —— 闭包(closure).闭包其实大家都已经谈烂了.尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭 ...

  8. servlet中this.getServletContext(); this.getServletConfig().getServletContext(); 的区别

    WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用.ServletConfig对象中维护了ServletContext对象的引用,开发人 ...

  9. hibernate事务管理 (jdbc jta)

    hibernate的两种事务管理jdbc 和jta方式.下边说说两者的区别一.说明一下jdbc和jta方式事务管理的区别:JDBC事务由Connnection管理,也就是说,事务管理实际上是在JDBC ...

  10. iOS instruments之ui automation的简单使用(高手绕道)

    最近使用了几次instruments中的automation工具,现记录下automation的简单使用方法,希望对没接触过自动化测试又有需求的人有所帮助.  UI 自动测试是iOS 中重要的附加功能 ...