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);
转载于:https://blog.51cto.com/9233403/1970606