C++と色々

主にC++やプログラムに関する記事を投稿します。

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