C++设计模式实现--访问者(Visitor)模式

原创 2014年07月04日 16:12:22

一. 访问者模式

定义:表示一个作用于某对象结构中的各元素的操作。它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作

结构如下:


二. 举例

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

两种种子,一种是普通的种子(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. 这种结构的优点是,增加新的操作很容易;缺点是,增加新的数据结构有点困难,因为你要在每一个访问者里都添加相应的操作

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

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

status(状态) 相当于 visitor(访问者),这个是可变且易变的。要注意的是,每个访问者都要对所有的元素(element)进行操作。

5. 事实上我们很少用这种模式,因为数据结构(element)不变的情况很少。


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

我所理解的设计模式(C++实现)——访问者模式(Visitor Pattern)

我们去银行柜台办业务,一般情况下会开几个个人业务柜台的,你去其中任何一个柜台办理都是可以的。我们的访问者模式可以很好付诸在这个场景中:对于银行柜台来说,他们是不用变化的,就是说今天和明天提供个人业务的...
  • LCL_data
  • LCL_data
  • 2013年09月12日 16:07
  • 18439

访问者模式(Visitor Pattern)的c++实现示例

访问者模式是一种分离对象数据结构与行为的方法,通过这种分离,可以为一个已存在的类或类群(即被访问者)增加新的操作(即访问者)而无需为它们作任何修改。访问者模式属于行为型模式。 为什么要使用访问者模式?...
  • hityct1
  • hityct1
  • 2009年05月09日 23:47
  • 6269

Vistor访问者模式(C++访问者模式)

Visitor模式在不破坏类的前提下,为类提供增加新的新操作。 Visitor模式经常用于将更新的设计封装在一个类中,并且由待更改的类提供一个接受接口,其关键技术在于双分派技术,Element类提供接...
  • yc7369
  • yc7369
  • 2014年12月08日 23:46
  • 745

设计模式之访问者模式(Visitor)

  • 2011年07月07日 09:40
  • 13KB
  • 下载

设计模式---访问者模式(C++实现)

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。     ...
  • My_heart_
  • My_heart_
  • 2017年03月21日 15:38
  • 380

设计模式C++实现二十三:访问者模式

访问者模式(Visitor):表示一个作用于某个对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用...
  • shiwazone
  • shiwazone
  • 2015年05月18日 12:29
  • 593

C++程序设计课程主页-2014级

我和我的2014级学生在此开始“C++程序设计”课程的学习。借助于博客,我们将继续将”积累代码行“的实践进行下去,展现IT学子应有的风采。  联系我:可看CSDN博客和新浪博客,也可以上人人网加我好友...
  • sxhelijian
  • sxhelijian
  • 2014年09月14日 16:54
  • 25922

Windows内核模式和用户模式

运行 Windows 的计算机中的处理器有两个不同模式:“用户模式”和“内核模式”。根据处理器上运行的代码的类型,处理器在两个模式之间切换。应用程序在用户模式下运行,核心操作系统组件在内核模式下运行。...
  • KingCat666
  • KingCat666
  • 2015年03月11日 16:34
  • 1556

设计模式总结之Visitor Pattern(访问者模式)

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。...
  • cooldragon
  • cooldragon
  • 2016年08月12日 12:10
  • 4174

JAVA设计模式十四--Visitor(访问者模式)

访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式。 据《大话设计模式》中说算是最复杂也是最难以理解的一种模式了。    定义(源于GoF《Design...
  • hfmbook
  • hfmbook
  • 2012年06月22日 10:20
  • 8953
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++设计模式实现--访问者(Visitor)模式
举报原因:
原因补充:

(最多只允许输入30个字)