首页 > 代码库 > Visitor - 访问者模式

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. };
子类主要重新定义两个方法,就可以得到想要的结果。

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

Visitor - 访问者模式