Visitor

#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;
}
 



参考サイト

デザインパターンを“喩え話”で分かり易く理解する
http://www.netlaputa.ne.jp/~hijk/study/oo/designpattern.html



デザインパターンの骸骨たち
http://www002.upp.so-net.ne.jp/ys_oota/mdp/
最終更新:2011年11月16日 23:08