C++访问者模式

简介:

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  ,如需转载请自行联系原作者


相关文章
|
6月前
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
68 1
|
6月前
|
设计模式 算法 编译器
C++访问者模式:设计与应用之美
C++访问者模式:设计与应用之美
50 0
|
设计模式 C++ 容器
【设计模式学习笔记】访问者模式、状态模式案例详解(C++实现)
【设计模式学习笔记】访问者模式、状态模式案例详解(C++实现)
347 1
【设计模式学习笔记】访问者模式、状态模式案例详解(C++实现)
|
C++
C++访问者模式
简述 访问者模式(Visitor Pattern)表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
1436 0
|
1天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
13 4
|
2天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
12 4
|
25天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
22 4
|
25天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
20 4
|
25天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
18 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)