のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

DesignPattern Proxy(代理人ですね)

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

さて、今日はDesignPatternのProxyについて

Proxy

まぁ何やってても良く聞くワードですが、代理人という意味が篭っています。
自分がない部分の処理を他に移譲します。
無駄にクラスを拡張するなという意味もこもってそうですが…。

#include <iostream>
#include <string>

using namespace std;

//基底
class Pizza{
public:
	virtual void createNormalPizza() = 0;
	virtual void createBitterPizza() = 0;
	virtual void createSpicyPizza() = 0;
};

// 辛いピザ
class SpicyPizza:public Pizza{
public:
	virtual void createNormalPizza();
	virtual void createBitterPizza();
	virtual void createSpicyPizza();
};

void SpicyPizza::createNormalPizza(){
	cout << "チーズピザ" << endl;
}

void SpicyPizza::createBitterPizza(){
	cout << "バジルピザ" << endl;
}

void SpicyPizza::createSpicyPizza(){
	cout << "激辛ピザ" << endl;
}

//苦いピザ
class BitterPizza:public Pizza{
public:
	virtual void createNormalPizza();
	virtual void createBitterPizza();
	virtual void createSpicyPizza();
};

void BitterPizza::createNormalPizza(){
	cout << "チーズピザ" << endl;
}

void BitterPizza::createBitterPizza(){
	cout << "バジルピザ" << endl;
}

//作れないので、スパイシーなピザの苦い部分をかわりに提供する
void BitterPizza::createSpicyPizza(){
	SpicyPizza *spicy_pizza = new SpicyPizza;
	spicy_pizza->createSpicyPizza();
}

//作る
class Cook{
public:
	void createPizza(){
		BitterPizza *bitterPizza = new BitterPizza();
		bitterPizza->createNormalPizza();
		bitterPizza->createSpicyPizza();
		bitterPizza->createBitterPizza();
	}
};

int main(int argc, char const *argv[]){
	Cook *cook = new Cook();
	cook->createPizza();
	return 0;
}

今回はSpicyなピザとBitterなピザを作りました
さて、このBitterなピザに辛いのを付け加えたいとしましょう。
しかし、そんな機能はない…
どうするか・・・・・?

ええ、中でスパイシーなピザを呼び出し作るのです。
要するに自分で賄えない部分は別のクラスから呼び出すようなことをしています。