Visitor.h文件内容如下:
访问者和元素之间互以对方为参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
#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
|
调用方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
ElementA ea(
"元素A"
);
ElementB eb(
"元素B"
);
VisitorOne va;
VisitorTwo vb;
// 双分派,“接受者”和“访问者”决定了一个操作
ea.Accept(&va);
ea.Accept(&vb);
eb.Accept(&va);
eb.Accept(&vb);
|
本文转自Chinayu201451CTO博客,原文链接:http://blog.51cto.com/9233403/1970606
,如需转载请自行联系原作者