#include <iostream>
#include <string>
#include <vector>
using namespace std;
class element;
class visitor
{
public:
visitor(string name): _name(name){}
virtual ~visitor(){}
virtual void visit_concrete_elementA(element *) =0;
virtual void visit_concrete_elementB(element *) =0;
string name(){return _name;}
protected:
visitor(){}
string _name;
};
class element
{
public:
virtual ~element(){}
virtual void accept(visitor *vis) =0;
protected:
element(){}
};
class concrete_visitorA : public visitor
{
public:
concrete_visitorA(string name):visitor(name){}
void visit_concrete_elementA(element *ele)
{
cout<<"visitorA visit elementA... "<<endl;
ele->accept(this);
}
void visit_concrete_elementB(element *ele)
{
cout<<"visitorA visit elementB... "<<endl;
ele->accept(this);
}
};
class concrete_visitorB : public visitor
{
public:
concrete_visitorB(string name):visitor(name){}
void visit_concrete_elementA(element *ele)
{
cout<<"visitorB visit elementA... "<<endl;
ele->accept(this);
}
void visit_concrete_elementB(element *ele)
{
cout<<"visitorB visit elementA... "<<endl;
ele->accept(this);
}
};
class concrete_elementA : public element
{
public:
void accept(visitor *vis)
{
cout<<"elementA accepted... :"<< vis->name()<<endl;
}
};
class concrete_elementB : public element
{
public:
void accept(visitor *vis)
{
cout<<"elementA accepted... :"<< vis->name()<<endl;
}
};
int main()
{
visitor *vA = new concrete_visitorA(string("A"));
visitor *vB = new concrete_visitorB(string("B"));
element *eA = new concrete_elementA;
element *eB = new concrete_elementB;
vA->visit_concrete_elementA(eA);
vA->visit_concrete_elementB(eB);
vB->visit_concrete_elementA(eA);
vB->visit_concrete_elementB(eB);
delete vA;delete vB;delete eA;delete eB;
return 0;
}