代码实现:
#include <iostream>
#include <string>
#include "list"
using namespace std;
class Visitor;
class ParkElement
{
public:
virtual void accept(Visitor* visitor) = 0;
};
class Visitor
{
public:
virtual void visit(ParkElement* park) = 0;
};
class ParkA : public ParkElement
{
public:
virtual void accept(Visitor* visitor)
{
visitor->visit(this);
}
};
class ParkB : public ParkElement
{
public:
virtual void accept(Visitor* visitor)
{
visitor->visit(this);
}
};
class Park : public ParkElement
{
public:
Park()
{
parkElements.clear();
}
void addParkElement(ParkElement* pe)
{
parkElements.push_back(pe);
}
virtual void accept(Visitor* visitor)
{
for (list<ParkElement*>::iterator it = parkElements.begin(); it != parkElements.end(); it++)
{
(*it)->accept(visitor);
}
}
private:
list<ParkElement*> parkElements;
};
class VisitorA :public Visitor
{
public:
virtual void visit(ParkElement* park)
{
cout << "VisitorA visit park" << endl;
}
};
class VisitorB :public Visitor
{
public:
virtual void visit(ParkElement* park)
{
cout << "VisitorB visit park" << endl;
}
};
class VisitorManager :public Visitor
{
public:
virtual void visit(ParkElement* park)
{
cout << "VisitorManager visit park" << endl;
}
};
void main01()
{
ParkElement* parkA = new ParkA;
ParkElement* parkB = new ParkB;
Visitor* visitorA = new VisitorA;
Visitor* visitorB = new VisitorB;
parkA->accept(visitorA);
parkB->accept(visitorB);
delete parkA;
delete parkB;
delete visitorA;
delete visitorB;
}
void main()
{
ParkElement* parkA = new ParkA;
ParkElement* parkB = new ParkB;
Park* park = new Park;
park->addParkElement(parkA);
park->addParkElement(parkB);
Visitor* visitorManager = new VisitorManager;
park->accept(visitorManager);
delete parkA;
delete parkB;
delete park;
delete visitorManager;
}