Decorator

#include <iostream>
using namespace std;
 
class TextComponent {
public:
	virtual ~TextComponent() { }
	virtual void PrintOperation() = 0;
};
 
class BodyText : public TextComponent {
public:
	virtual void PrintOperation() {
		cout << "Body Text." << endl;
	}
};
 
class TextDecorator : public TextComponent {
public:
	TextDecorator(TextComponent *component) {
		m_component = component;
	}
	virtual ~TextDecorator() {
		delete m_component;
	}
	virtual void PrintOperation() {
		m_component->PrintOperation();
	}
private:
	TextComponent *m_component;
};
 
class HeaderDecorator : public TextDecorator {
public:
	HeaderDecorator(TextComponent *component)
		: TextDecorator(component) { }
	virtual void PrintOperation() {
		cout << "*** Header ***" << endl;
		TextDecorator::PrintOperation();
	}
};
 
class FooterDecorator : public TextDecorator {
public:
	FooterDecorator(TextComponent *component)
		: TextDecorator(component) { }
	virtual void PrintOperation() {
		TextDecorator::PrintOperation();
		cout << "*** Footer ***" << endl;
	}
};
 
 
int main(int argc, char **argv) {
	TextComponent *component;
	component = new BodyText;
	if (argc > 1) {
		component = new HeaderDecorator(component);
	}
	if (argc > 2) {
		component = new FooterDecorator(component);
	}
	component->PrintOperation();
	delete component;
	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日 05:50