/* Visitor类 * 为该对象结构中ConcreteElement的每一个类声明一个Visit操作。 */ class Visitor { public: virtual void VisitConcreteElementA( ConcreteElementA *a ) = 0; virtual void VisitConcreteElementB( ConcreteElementB *b ) = 0; }; /* ConcreteVisitor类 * 具体访问者,实现每个由Visitor声明的操作。 * 每个操作实现算法的一部分,而该算法片段乃是对应于结构中对象的类。 */ class ConcreteVisitor1 : public Visitor { public: virtual void VisitConcreteElementA( ConcreteElementA *a ) { ... } virtual void VisitConcreteElementB( ConcreteElementB *b ) { ... } }; /* Element类 * 定义一个Accept操作,它以一个访问者为参数。 */ class Element { public: virtual void Accept( Visitor *visitor ) = 0; }; /* ConcreteElement类 * 具体元素,实现Accept操作 */ class ConcreteElementA : public Element { public: virtual void Accept(Visitor *visitor) { visitor->VisitConcreteElementA(this); } void OperationA() { // 其他相关方法 } }; /* ObjectStructure类 * 能枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。 */ class ObjectStructure { private: List elements; public: void Attach(Element *element) { elements.add(element); } void Detach(Element *element) { elements.remove(element); } void Accept(Visitor *visitor) { foreach( Element e in elements ) { e->Accept(visitor); } } }; // 客户端代码 int main() { ObjectStructure *o = new ObjectStructure(); o->Attach( new ConcreteElementA() ); o->Attach( new ConcreteElementB() ); ConcreteVisitor1 *v1 = new ConcreteVisitor1(); ConcreteVisitor2 *V2 = new ConcreteVisitor2(); o->Accept(v1); o->Accept(v2); }