#include <iostream>
#include <string>
using namespace std;
class Visitor;
class Acceptor {
public:
virtual void accept(Visitor *visitor) = 0;
};
class ConcreteAcceptorA : public Acceptor {
public:
virtual void accept(Visitor *visitor);
string getinfo() {
string ret = "ConcreteAcceptorA";
return ret;
}
};
class ConcreteAcceptorB : public Acceptor {
public:
virtual void accept(Visitor *visitor);
int getnum() {
return 123;
}
};
class Visitor {
public:
Visitor() { }
virtual void visit(ConcreteAcceptorA *acceptor) = 0;
virtual void visit(ConcreteAcceptorB *acceptor) = 0;
};
class ConcreteVisitor : public Visitor {
public:
virtual void visit(ConcreteAcceptorA *acceptor) {
string info = acceptor->getinfo();
cout << info.c_str() << endl;
}
virtual void visit(ConcreteAcceptorB *acceptor) {
int num = acceptor->getnum();
cout << "visit(ConcreteAcceptorB) " << num << endl;
}
};
/////
void ConcreteAcceptorA::accept(Visitor *visitor) {
visitor->visit(this);
}
void ConcreteAcceptorB::accept(Visitor *visitor) {
visitor->visit(this);
}
int main(int argc, char **argv) {
Acceptor *acceptor;
if (argc == 1) {
acceptor = new ConcreteAcceptorA;
} else {
acceptor = new ConcreteAcceptorB;
}
ConcreteVisitor *visitor = new ConcreteVisitor;
acceptor->accept(visitor);
delete visitor;
delete acceptor;
return 0;
}
参考サイト
最終更新:2011年11月16日 23:08