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

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. docker 解决容器时间与主机时间不一致的问题

    环境: 1.阿里云ecs服务器 2.docker 3.docker镜像 centos7.4.1708 方法一: 查看主机时间: [root@iZbp1625jeg61bc2zzfcotZ docker ...

  2. 设计模式学习总结(八)策略模式(Strategy)

    策略模式,主要是针对不同的情况采用不同的处理方式.如商场的打折季,不同种类的商品的打折幅度不一,所以针对不同的商品我们就要采用不同的计算方式即策略来进行处理. 一.示例展示: 以下例子主要通过对手机和 ...

  3. stream4

    import java.util.Comparator; import java.util.function.BinaryOperator; public class BinaryOperatorTe ...

  4. Activemq API使用(不整合spring)

    首先需要引入activemq的jar包,这里用的是5.14.4版本的 <!-- https://mvnrepository.com/artifact/org.apache.activemq/ac ...

  5. GreenPlum 大数据平台--分区表(二)

    01,创建分区表 [PARTITION BY partition_type (column) [SUBPARTITION BY partition_type (column)] [SUBPARTITI ...

  6. python-OS.path.join()路径拼接

    os.path.join()函数: 第一个以”/”开头的参数开始拼接,之前的参数全部丢弃. 以上一种情况为先.在上一种情况确保情况下,若出现”./”开头的参数,会从”./”开头的参数的上一个参数开始拼 ...

  7. Oracle 客户端、服务器、数据库、数据库对象(表、视图等)的关系

    1.数据库服务器 所谓数据库服务器,只是在机器上安装了一个数据库管理软件,这个软件可以管理多个数据库.一般开发人员会针对每一个应用创建一个数据库 2.单实例数据库模式下的数据库服务器.数据库.数据库实 ...

  8. a标签的 onclick 和 href 哪个先执行?

    以下这种写法,onclick 事件先执行, href 属性下的动作后执行(页面跳转或 javascript 伪链接),如果不想执行 href 属性下的动作,onclick 需要返回 false. &l ...

  9. Java入门系列-09-循环结构

    这篇文章为你搞懂5个问题 while 循环如何使用 do-while 循环的使用 for 循环的使用 break.continue 的使用 循环结构的嵌套使用 生活中有很多事情需要我们重复的去做,比如 ...

  10. json数据的存储与读取

    1.  json数据格式: data = [ {"key1":"xxx","item":"ddd"}, {"k ...