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


相关文章
|
设计模式 存储 uml
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
C++ 设计模式实战:外观模式和访问者模式的结合使用,派生类访问基类的私有子系统
266 1
|
设计模式 算法 编译器
C++访问者模式:设计与应用之美
C++访问者模式:设计与应用之美
232 0
|
设计模式 C++ 容器
【设计模式学习笔记】访问者模式、状态模式案例详解(C++实现)
【设计模式学习笔记】访问者模式、状态模式案例详解(C++实现)
570 1
【设计模式学习笔记】访问者模式、状态模式案例详解(C++实现)
|
C++
C++访问者模式
简述 访问者模式(Visitor Pattern)表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
1646 0
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
621 12
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
319 16
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
338 0
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
523 0