Visitor.h文件内容如下:
访问者和元素之间互以对方为参数
#ifndef __VISITOR__ #define __VISITOR__ #include <iostream> #include <string> #include <vcl.h> using namespace std; class Element; ///访问者接口类 class Visitor { public: virtual void Visit(Element *e) = 0; }; //具体访问者A class VisitorOne : public Visitor { public: //实现访问接口,参数为元素,在类外面实现函数体 virtual void Visit(Element *e); }; //具体访问者B class VisitorTwo : public Visitor { public: //实现访问接口,参数为元素,在类外面实现函数体 virtual void Visit(Element *e); }; //========================================================= //Element类 class Element { public: virtual void Accept(Visitor *v) { v->Visit(this);//调用访问者接口 } char* GetName() { return (char*)m_name.c_str(); } public: //类中待访问的元素 string m_name; }; //具有个性数据的元素 class ElementA: public Element { public: ElementA(string s) { m_name = s;//传入父类成员m_name中 } }; class ElementB : public Element { public: ElementB(string s) { m_name = s; } }; //========================================================= //访问者类one对元素处理方法(须声明到Element类的后面否则编译不能通过) void VisitorOne::Visit(Element *e) { //获取元素中的数据 char * data = e->GetName(); char szTemp[] = "正在处理数据:"; strcat(szTemp,data); char szTip[] = "第一个访问者"; MessageBox(0,+szTemp,szTip,0); } //访问者类two对元素的处理方法 void VisitorTwo::Visit(Element *e) { //获取元素中的数据 char * data = e->GetName(); char szTemp[] = "正在处理数据:"; strcat(szTemp,data); char szTip[] = "第二个访问者"; MessageBox(0,+szTemp,szTip,0); } #endif
调用方法如下:
ElementA ea("元素A"); ElementB eb("元素B"); VisitorOne va; VisitorTwo vb; // 双分派,“接受者”和“访问者”决定了一个操作 ea.Accept(&va); ea.Accept(&vb); eb.Accept(&va); eb.Accept(&vb);
原文地址:http://9233403.blog.51cto.com/9223403/1970606