访问者模式是编者自学习设计模式以来最难的一个模式。
定义:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
#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;
}
访问者模式的优点在于可以将处理和数据结构分离开,并且灵活的添加处理,但是前提是我们的数据结构相当的稳定如果需要创建新的数据结构那么不要使用访问者模式。每增加一个新的操作就增加一个新的访问者,访问者只需要传入数据,那么在数据对象中对访问者提供接口,再将自己的数据传入访问者即可
访问者的缺点就是将添加新的数据结构变得困难。