Decoratorパターンとパラメータ化継承
処理の前後に処理を追加する、ってなんか2つ似てるなと思ったので書いてみて、うんやっぱ似てるってなった。
#include <iostream> #include <string> using namespace std; //デコレータパターン namespace dec { //インターフェイス class writer { public: virtual void write_data(string str) = 0; virtual ~writer() {} }; //基本機能クラス class console_writer : public writer { public: void write_data(string str) { cout << str << endl; } }; //追加機能クラス class br_writer : public writer { public: explicit br_writer(writer* out) : out(out) { } void write_data(string str) { out->write_data("<br>" + str + "<br>"); } virtual ~br_writer() { delete out; } private: writer* out; }; } //パラメータ化継承 namespace par { //基本機能クラス class writer { public: string write_data(string str) { return str; } }; //追加機能クラス template<class B> class br_writer : public B { public: string write_data(string str) { return "<br>" + B::write_data(str) + "<br>"; } }; } int main() { { using namespace dec; br_writer* br = new br_writer(new br_writer(new br_writer(new console_writer()))); br->write_data("hoge"); delete br; } { using namespace par; br_writer<br_writer<br_writer<writer>>> br; cout << br.write_data("foo") << endl; } }