访问者模式(Visitor)表示一个作用于某对象结构中的各元素的操作。它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作。
//visitor.h
#ifndef _VISITOR_H_
#define _VISITOR_H_
class Element;
class Vistitor
{
public:
virtual void VisitConcreteElementA(Element* ceA)=0;
virtual void VisitConcreteElementB(Element* ceB)=0;
};
class ConcreteVisitorA:public Vistitor
{
void VisitConcreteElementA(Element* ceA);
void VisitConcreteElementB(Element* ceB);
};
class ConcreteVisitorB:public Vistitor
{
void VisitConcreteElementA(Element* ceA);
void VisitConcreteElementB(Element* ceB);
};
#endif
//visitor.cpp
#include "Visitor.h"
#include "Element.h"
#include <iostream>
using namespace std;
void ConcreteVisitorA::VisitConcreteElementA(Element* ceA)
{
cout<<"I will visit ConcreteElementA..."<<endl;
}
void ConcreteVisitorA::VisitConcreteElementB(Element* ceA)
{
cout<<"I will visit ConcreteElementB..."<<endl;
}
void ConcreteVisitorB::VisitConcreteElementA(Element* ceA)
{
cout<<"I will visit ConcreteElementA..."<<endl;
}
void ConcreteVisitorB::VisitConcreteElementB(Element* ceA)
{
cout<<"I will visit ConcreteElementB..."<<endl;
}
//Element.h
#ifndef _ELEMENT_H_
#define _ELEMENT_H_
class Vistitor;
class Element
{
public:
virtual void Accept(Vistitor* vis)=0;
};
class ConcreteElementA:public Element
{
public:
void Accept(Vistitor* vis);
};
class ConcreteElementB:public Element
{
public:
void Accept(Vistitor* vis);
};
#endif
//Element.cpp
#include "Element.h"
#include "Visitor.h"
#include <iostream>
using namespace std;
void ConcreteElementA::Accept(Vistitor* vis)
{
vis->VisitConcreteElementA(this);
cout<<"visiting ConcreteElementA..."<<endl;
}
void ConcreteElementB::Accept(Vistitor* vis)
{
vis->VisitConcreteElementA(this);
cout<<"visiting ConcreteElementA..."<<endl;
}
//main.cpp
#include "Element.h"
#include "Visitor.h"
#include <iostream>
using namespace std;
int main()
{
Vistitor* vis = new ConcreteVisitorA();
Element* elm = new ConcreteElementA();
elm->Accept(vis);
return 0;
}