访问者模式(Visitor)
2015/5/25
访问者模式(Visitor)
访问者模式是编者自学习设计模式以来最难的一个模式。
定义:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
#include <iostream>
using namespace std;
class Visitor;
class library{
public:
/*定义一个Accept操作它以访问者为一个参数*/
virtual void Accept(Visitor *visitor)=0;
};
/*创建数据结构并且提供访问者的接口*/
class Book:public library{
private:
int page;
public:
Book(int page)
{
this->page=page;
}
int GetOfPage()
{
return page;
}
void Accept(Visitor *visitor);
};
class File:public library{
private:
int page;
public:
File(int page)
{
this->page=page;
}
int GetOfPage()
{
return page;
}
void Accept(Visitor *visitor);
};
class Visitor{
protected:
int sum;
public:
Visitor(){
sum=0;
}
virtual void GetOfBookPage(Book *t)=0;
virtual void GetOfFilePage(File *t)=0;
};
/*增加不同处理功能的访问者*/
class BookPage:public Visitor{
public:
void GetOfBookPage(Book *t)
{
sum+=t->GetOfPage();
cout<<"Page="<<sum<<endl;
}
void GetOfFilePage(File *t)
{
}
};
class FilePage:public Visitor{
public:
void GetOfBookPage(Book *t)
{
}
void GetOfFilePage(File *t)
{
sum+=t->GetOfPage();
cout<<"Page="<<sum<<endl;
}
};
/*当这个函数被调用的时候Book对象必然已经创建并且具有自己的信息*/
void Book::Accept(Visitor *visitor)
{
/*将自己的信息传给访问者,那么当访问者得到以后就可以实现操作*/
visitor->GetOfBookPage(this);
}
void File::Accept(Visitor *visitor)
{
visitor->GetOfFilePage(this);
}
int main(void)
{
Book *book=new Book(168);
File *file=new File(132);
Visitor *bp=new BookPage();
Visitor *fp=new FilePage();
book->Accept(bp);
file->Accept(fp);
return 0;
}
访问者模式的优点在于可以将处理和数据结构分离开,并且灵活的添加处理,但是前提是我们的数据结构相当的稳定如果需要创建新的数据结构那么不要使用访问者模式。每增加一个新的操作就增加一个新的访问者,访问者只需要传入数据,那么在数据对象中对访问者提供接口,再将自己的数据传入访问者即可
访问者的缺点就是将添加新的数据结构变得困难。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异