Chain of Responsibility

#include <iostream>
#include <stdlib.h>
using namespace std;
 
class Handler {
public:
	Handler(Handler *handler) {
		m_successor = handler;
	}
	virtual ~Handler() {
		delete m_successor;
	}
	virtual void EventHandler(int id) = 0;
protected:
	virtual void Next(int id) {
		if (m_successor != NULL) {
			m_successor->EventHandler(id);
		}
	}
	Handler *m_successor;
};
 
class A_Handler : public Handler {
public:
	A_Handler(Handler *handler) : Handler(handler) { }
	virtual void EventHandler(int id) {
		if (id == 1) {
			cout << "A_Handler recv Event." << endl;
		} else {
			Next(id);
		}
	}
};
 
class B_Handler : public Handler {
public:
	B_Handler(Handler *handler) : Handler(handler) { }
	virtual void EventHandler(int id) {
		if (id == 2) {
			cout << "B_Handler recv Event." << endl;
		} else {
			Next(id);
		}
	}
};
 
 
int main(int argc, char **argv) {
	Handler *handler = NULL;
	handler = new A_Handler(handler);
	handler = new B_Handler(handler);
 
	if (argc != 2) {
		return 0;
	}
	int event = atoi(argv[1]);
	handler->EventHandler(event);
	delete handler;
	return 0;
}
 



参考サイト

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



デザインパターンの骸骨たち
http://www002.upp.so-net.ne.jp/ys_oota/mdp/

デザインパターンの使い方: Chain of Responsibility
http://japan.internet.com/developer/20081118/26.html
最終更新:2011年11月19日 12:05