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

原创 2009年05月09日 23:47:00

访问者模式是一种分离对象数据结构与行为的方法,通过这种分离,可以为一个已存在的类或类群(即被访问者)增加新的操作(即访问者)而无需为它们作任何修改。访问者模式属于行为型模式。

 

为什么要使用访问者模式?
    如何扩展一个现有的类层次结构来实现新行为?一般的方法是给类添加新的方法。但是万一新行为和现有对象模型不兼容怎么办?还有,类层次结构设计人员可能无法预知以后开发过程中将会需要哪些功能。以及,如果已有的类层次结构不允许修改代码,怎么能扩展行为呢?
    答案是在类层次结构设计中使用访问者模式。

 

访问者模式涉及的角色:
1)访问者(Visitor)
    访问者抽象接口,通过visit(Element)方法访问Element(数据结构),完成对Element的操作行为。
2)具体访问者(ConcreteVisitor)
    访问者的具体实现类。
3)元素(Element),也就是被访问者
    通过accept(Visitor)方法接受Visitor的访问。
4)具体元素(ConcreteElement)
    元素的具体实现类。
5)对象结构(ObjectStructure)
    拥有一组元素的组合对象。ObjectStructure本身也可以作为被访问者。

 

访问者模式的结构图(网上下载的):

访问者模式结构图(uml图)

当一个应用满足以下条件时,我们可以使用Visitor设计模式:
1)一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
2)需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。
3) 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
4) 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。

 

优点:
1)易于添加那些目前尚未考虑到的方法。(这也是使用访问者的原因:扩展功能)
2)可以使类更加小巧,因为那些很少使用的方法,可以在外部定义。(意味着如果一个方法经常使用,最好定义在类中;当然在第一次定义中没有考虑到此方法除外)

 

缺点:
1)访问者角色不适合具体元素角色经常发生变化的情况。(如:增加新具体元素类,访问者接口就需要改变了。)
2)访问者角色要执行与元素角色相关的操作,就必须让元素角色将自己内部属性暴露出来,这就破坏了元素角色的封装性。访问者和被访问的对象的耦合性很大。
3)元素与访问者之间能够传递的信息有限,这往往也会限制访问者模式的使用。(因为访问者不能直接访问元素的私有数据)

 

示例:

 

后话:
   使用了访问者模式以后,对于原来的类层次增加新的操作,仅仅需要实现一个具体访问者角色就可以了,而不必修改整个类层次。而且这样符合“开闭原则”的要求。而且每个具体的访问者角色都对应于一个相关操作,因此如果一个操作的需求有变,那么仅仅修改一个具体访问者角色,而不用改动整个类层次。但是“开闭原则”的遵循总是片面的。如果系统中的类层次发生了变化,会对访问者模式产生什么样的影响呢?你必须修改访问者角色和每一个具体访问者角色。
   模式设计教材书经常提及的一句话:发现变化并封装之。是否采用访问者模式,就要看(或预见)“变化”是什么了。访问者模式中,“变化”是主要是具体访问者,其次是对象结构。但如果(具体)元素也改变,就万万不能用访问者模式,因为“牵一发动全身”,维护性就太差了。
   再唠叨一下为什么使用访问者模式的个人看法:
对象结构使用的了(具体)元素(即被访问者),而(具体)元素的功能不全,而直接在元素中添加功能不太好(如:不允许修改元素;或者增加不常用的功能会使类太臃肿等等),那么我们就定一个辅助类(就是访问者)来完成这个功能。于是,作为预见性,我们为元素(即被访问者)增加一个accept(Visitor)方法作为接口,以作不时之需。为元素增加新的功能,只需增加新的访问者类。


参考文献:
1.《设计模式初学者指南》,徐迎晓等译,机械工业出版社
2.网上,东抄一下,西抄一下。

一步一步用Delphi6实现Web Service

      本文介绍的是如何用Delphi6开发Web Service程序,并把服务程序放在IIS Web服务器上提供给各种客户程序调用。一编写服务程序第一步:File----->New----->O...
  • coala
  • coala
  • 2001-10-26 11:27:00
  • 733

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

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

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

一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作。它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 结构如下: 二. 举例 假设有一项...
  • L_Andy
  • L_Andy
  • 2014-07-04 16:12:22
  • 1333

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

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

23种设计模式(9):访问者模式

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 类型:行为类模式 类图:        访问者模式可能是行为类模式中最复杂的一种...
  • zhengzhb
  • zhengzhb
  • 2012-04-23 14:49:16
  • 60513

C++访问者模式

简述 访问者模式(Visitor Pattern)表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。 简述 模式结构 优缺点 适用场景 案...
  • u011012932
  • u011012932
  • 2018-02-24 18:06:16
  • 358

c++ 访问者模式

/** VISITOR模式:将操作独立于类之外,类根据自己需要的操作而接受相应的访问者。 这样做的好处是如果需要实现一个新操作,类的结构不用变,特别是整个类层次的操作,如果要变,代价是比较大...
  • TimothyFly
  • TimothyFly
  • 2012-08-16 09:17:34
  • 1405

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

访问者模式 在GOF的《设计模式:可复用面向对象软件的基础》一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作...
  • zang141588761
  • zang141588761
  • 2016-12-06 11:21:26
  • 155

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

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

C++ 设计模式 —— 访问者(Visitor)

访问者设计模式的实现借助于两个继承体系, (1)elements:一个是被操作的类(基类及其子类) (2)visitors:一个定义了一系列操作的访问者(基类及其子类) 访问者模式是一种行为型设计模式...
  • lanchunhui
  • lanchunhui
  • 2016-03-28 21:46:56
  • 1014
收藏助手
不良信息举报
您举报文章:访问者模式(Visitor Pattern)的c++实现示例
举报原因:
原因补充:

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