目的
在不改变某类层次结构中的各个类的前提下,定义作用于类中各元素的新操作。
案例
现在有不同的设备Equipment,例如:Chassis,FloppyDisk等等。有的人想了解它的性能,但有的人想了解它的价格,可能还有人想了解其他方面的信息,如制造商,制造材料等。但是当一个Equipment的的类定义好了,子类也定义好了之后,要增加新的操作,就需要改变所有的类,这时候可以考虑使用Visitor模式。访问者模式只需要在Equiment中提供一个方法accept(Visitor*),把信息通过Visitor类的visitor方法传递给Visitor对象:
Equipment提供accept操作,使其可以与一个访问者一起工作:
class Equipment
{
public:
virtual void accept(Visitor* v) = 0;
};
在子类中实现accept操作:
class FloppyDisk : public Equipment
{
public:
virtual void accept(Visitor* v);
};
void FlopyyDisk::accept(Visitor* v)
{
v->visit(this);
}
像Chassis拥有子设备,就需要对每个子设备单独调用accept操作:
class Chassis : public Equipment
{
public:
virtual void accept(Visitor* v);
private:
std::vector<Equipment*> m_parts;
};
void Chassis::accept(Visitor* v)
{
for(int i = 0; i < m_parts.size(); ++i)
m_parts[i]->accept(v);
v->visit(this);
}
Visitor提供方法访问Equipment对象:
class Visitor
{
public:
virtual void visit(FloppyDisk* floppyDisk) = 0;
virtual void visit(Chassis* chassis) = 0;
};
子类主要重新定义两个方法,就可以得到想要的结果。
适用性
- 一个对象结构包含许多类对象,它们有不同的接口,想对这些对象实施一些依赖于其具体类的操作。
- 需要对一个对象结构中的对象进行许多不同的并且不相关的操作,而又想避免让这些操作污染对象的类。
- 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。