Adapterパターン

Adapter パターン - Wikipedia
上記LINKにある「委譲を利用したAdapter」の方で実装。継承を利用した版はC++だと多重継承になるんでめんどい。


Bannerクラス(Adaptee)が既に手元にある時、それをPrintBanner(Adapter)に委譲して、Printクラス(Target)として使うパターン。Adapteeに手を入れないで再利用できるのがメリット。

#include <cstring>
#include <iostream>
using namespace std;

//Adaptee
class Banner
{
public :
	Banner(string str){
		this->string_ = str;
	}
	void ShowWithParen(){
		cout << string_.c_str() << endl;
	}
	void ShowWithAster(){
		cout << "*" << string_.c_str() << "*" << endl;
	}
private :
	string string_;
};
//Target
class Print
{
public :
	virtual ~Print(){};
	virtual void PrintWeak() = 0;
	virtual void PrintStrong() = 0;
};
//Adapter
class PrintBanner : public Print
{
public :
	~PrintBanner(){
		delete banner_;
	}
	PrintBanner(string str) {
		banner_ = new Banner(str);
	}
	void PrintWeak(){
		banner_->ShowWithParen();
	}
	void PrintStrong(){
		banner_->ShowWithAster();
	}
private :
	Banner * banner_;
};
int main()
{
	Print *p = new PrintBanner("Hello");
	p->PrintWeak();
	p->PrintStrong();
	delete p;
	getchar();
	return 0;
}