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

一. 访问者模式

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

结构如下:

二. 举例

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

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

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

结构如下:

代码如下:

[cpp] view
plain
copy

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

三. 说明

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

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

3. 这种结构的优点是,增加新的操作很容易;缺点是,增加新的数据结构有点困难,因为你要在每一个访问者里都添加相应的操作。

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

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

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

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

C++设计模式实现--访问者(Visitor)模式,布布扣,bubuko.com

时间: 2024-10-19 04:20:25

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

Java 实现访问者(Visitor)模式

interface Visitor { void visit(Gladiolus g); void visit(Chrysanthemum c); } // concrete visitor 名称访问 class StringVisitor implements Visitor { String s; public String toString() { return s; } public void visit(Gladiolus g) { s = "Gladiolus"; } pu

设计模式学习笔记--访问者(Visitor)模式

写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式. 设计模式就是抽象出来的东西,它不是学出来的,是用出来的:或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以"模式专家"的角度来看,都是最佳的设计,不得不说是"最佳的模式实践",这

设计模式23:Visitor 访问者模式(行为型模式)

Visitor 访问者模式(行为型模式) 动机(Motivation)在软件构造过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的修改,将会给子类带来繁重的变更负担,甚至破坏原有设计. 如果在不变更类层次结构的前提下,在运行时更加需要透明地为类层次结构上的各个类活动添加新的操作,从而避免上述问题? 意图(Intent) 表示一个作用于某种对象结构中各元素的操作.它可以在不改变各元素的类的前提下定义作用于这些元素的新操作.——<设计模式>GoF 示例代

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

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

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

意图: 表示一个作用于某对象结构的各元素的操作.它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作. 动机: 之前在学校的最后一个小项目就是做一个编译器,当时使用的就是访问者模式. 在静态分析阶段,将源程序表示为一个抽象语法树,编译器需要在抽象语法树的基础上实施某些操作以进行静态语义分析.可能需要定义许多操作以进行类型检查.代码优化.流程分析.检查变量是否在使用前被赋值,等等. 这个需求的特点是:要求对不同的节点进行不同的处理. 常规设计方法:不同的节点封装不同的操作. 缺点是,节点

[设计模式] 23 访问者模式 visitor Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问者模式把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化.该模式的目的是要把处理从数据结构分离出来.访问者模式让增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者.访问者模式将有关的行为集中到一个访问者对象中.   初次接触,定义会显得晦涩并且难于理解,没关系,LZ来陪

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

设计模式:访问者(Visitor)模式 一.前言    什么叫做访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+对其进行处理就叫做访问,那么我们平常是怎么访问的,基本上就是直接拿着需要访问的地址(引用)来读写内存就可以了.    为什么还要有一个访问者模式呢,这就要放到OOP之中了,在面向对象编程的思想中,我们使用类来组织属性,以及对属性的操作,那么我们理所当然的将访问操作放到了类的内部,这样看起来没问题,但

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

访问者模式是一种对象的行为性模式,用于表示一个作用于某对象结构中的各元素的操作,它使得用户可以再不改变各元素的类的前提下定义作用于这些元素的新操作.访问者模式使得增加新的操作变得很容易,但在一定程度上破坏了封装性. 优点: 1)更容易添加新操作. 2)集中相关操作并且排除不相关操作. 使用场景: 1)对象结构包含许多具有不同接口的对象类,并且向要对这些依赖于具体类的对象进行操作. 2)定义对象结构的类很少被修改,但想要在此结构之上定义新的操作. Visitor 模式

【设计模式】访问者模式

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作. 介绍 意图:主要将数据结构与数据操作分离. 主要解决:稳定的数据结构和易变的操作耦合问题. 何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些