Visitor - 访问者模式

目的

在不改变某类层次结构中的各个类的前提下,定义作用于类中各元素的新操作。

案例

现在有不同的设备Equipment,例如:Chassis,FloppyDisk等等。有的人想了解它的性能,但有的人想了解它的价格,可能还有人想了解其他方面的信息,如制造商,制造材料等。但是当一个Equipment的的类定义好了,子类也定义好了之后,要增加新的操作,就需要改变所有的类,这时候可以考虑使用Visitor模式。访问者模式只需要在Equiment中提供一个方法accept(Visitor*),把信息通过Visitor类的visitor方法传递给Visitor对象:

Equipment提供accept操作,使其可以与一个访问者一起工作:

  1. class Equipment
  2. {
  3. public:
  4. virtual void accept(Visitor* v) = 0;
  5. };

在子类中实现accept操作:

  1. class FloppyDisk : public Equipment
  2. {
  3. public:
  4. virtual void accept(Visitor* v);
  5. };
  6. void FlopyyDisk::accept(Visitor* v)
  7. {
  8. v->visit(this);
  9. }

像Chassis拥有子设备,就需要对每个子设备单独调用accept操作:

  1. class Chassis : public Equipment
  2. {
  3. public:
  4. virtual void accept(Visitor* v);
  5. private:
  6. std::vector<Equipment*> m_parts;
  7. };
  8. void Chassis::accept(Visitor* v)
  9. {
  10. for(int i = 0; i < m_parts.size(); ++i)
  11. m_parts[i]->accept(v);
  12. v->visit(this);
  13. }

Visitor提供方法访问Equipment对象:

  1. class Visitor
  2. {
  3. public:
  4. virtual void visit(FloppyDisk* floppyDisk) = 0;
  5. virtual void visit(Chassis* chassis) = 0;
  6. };

子类主要重新定义两个方法,就可以得到想要的结果。

适用性

  • 一个对象结构包含许多类对象,它们有不同的接口,想对这些对象实施一些依赖于其具体类的操作。
  • 需要对一个对象结构中的对象进行许多不同的并且不相关的操作,而又想避免让这些操作污染对象的类。
  • 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。
时间: 2024-10-07 17:00:03

Visitor - 访问者模式的相关文章

Design Pattern Visitor 访问者模式

访问者模式,就是我们已经有一系列的对象了,那么就可以使用一个visitor对象一次性遍历所有的对象,就好像这个visitor访问了所有这些对象一样,所以就叫访问者模式. 实现起来也很简单,就是三个基类,其他类都是这些基类的衍生类. 下面的Action类就是访问者类了,而Person类就是被访问的对象类,而House是一个接待容器,可以接待不同的Action类. #include <stdio.h> #include <iostream> #include <string>

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

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

(24):(行为型模式) Visitor 访问者模式

[所有分类] (24):(行为型模式) Visitor 访问者模式

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

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

设计模式(十七)访问者模式(Visitor)-行为型

访问者模式Visitor 访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式.据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<Design Pattern>):表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 从定义可以看出结构对象是使用访问者模式必备条件,而且这个结构对象必须存在遍历自身各个对象的方法.这便类似于Java语言当中的collection

(转)访问者模式

原文:http://blog.csdn.net/zhengzhb/article/details/7489639 定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. 类型:行为类模式 类图: 访问者模式可能是行为类模式中最复杂的一种模式了,但是这不能成为我们不去掌握它的理由.我们首先来看一个简单的例子,代码如下: [java] view plaincopy class A { public void method1(){ System.o

(19)访问者模式

(19)访问者模式 定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. 类型:行为类模式 类图: 访问者模式可能是行为类模式中最复杂的一种模式了,但是这不能成为我们不去掌握它的理由.我们首先来看一个简单的例子,代码如下: class A { public void method1(){ System.out.println("我是A"); } public void method2(B b){ b.showA(this); }

Java设计模式(十一)访问者模式 中介者模式

(二十一)访问者模式 对已存在的类进行扩展,通常需要增加方法,但是如果需要的行为与现有的对象模型不一致,或者无法修改现有代码.在这种情况下,不更改类的层次结构,就无法扩展该层次结构的行为.如果运用了访问者模式,就可以支持开发人员扩展该类层次结构的行为. 和解释器模式一样,访问者模式通常是基于合成模式的. 访问者模式在不改变类层次结构的前提下,对该层次结构进行扩展. interface Visitor{ public void visit(VisiSubject sub); } interface

9.泡妞与设计模式(10) 访问者模式

VISITOR 访问者模式 访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变.访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化.访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类.访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中.当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的