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

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

DesignPattern Bridge(新しく機能を追加したい貴方へ)

Sponsored Links

皆さんこんにちは
お元気ですか。ねむい

さて、本日はDesign Patternについて

前回までは製造関係のデザインパターンの解説を行っていました。
今回からは構築についてのパターンを学習します。

Bridgeとは

日本語訳で「橋」ですね。つまりつなぐことかな
例えば、ある2つの物を作り、そこに更に何か機能を付け加えたい時に
新しくクラスを作り、機能を増設します。

このようにすることにより、元のクラスを弄ることなく
新しいクラスを追加することを可能とします。

クラス図

f:id:tereka:20140626104519p:plain

ソースコード

ピザ作ってたけど時間もはかりたいんだよーという処理

#include <iostream>
using namespace std;

//ピザ作るクラス
class CreatePizza{
public:
	virtual void makePizza(int x,int y) = 0;
};

class CreateCheesePizza:public CreatePizza{
public:
	virtual void makePizza(int x,int y);
};

void CreateCheesePizza::makePizza(int x,int y){
	cout << "CheesePizza:{cheese:" <<  x << ",meat:" << y << "}" << endl;
};

class CreateSpicyPizza:public CreatePizza{
public:
	virtual void makePizza(int x,int y);
};

void CreateSpicyPizza::makePizza(int x,int y){
	cout << "SpicyPizza:{cheese:" <<  x << ",meat:" << y << "}" << endl;
}

//橋渡し用クラス
class CreatePizzaBridge{
protected:
	CreatePizza* cp_b;
public:
	CreatePizzaBridge(CreatePizza *cp);
	virtual void makePizza(int x,int y) = 0;
};

CreatePizzaBridge::CreatePizzaBridge(CreatePizza *cp){
	cp_b = cp;
}

//それを継承させたもの
class CreatePizzaBridgeTimer:public CreatePizzaBridge{
public:
	CreatePizzaBridgeTimer(CreatePizza *cp);
	virtual void makePizza(int x,int y);
};

CreatePizzaBridgeTimer::CreatePizzaBridgeTimer(CreatePizza *cp) : CreatePizzaBridge(cp){
	cp_b = cp;
}

void CreatePizzaBridgeTimer::makePizza(int x,int y){
	clock_t start = clock();
	cp_b->makePizza(x,y);
	clock_t end = clock();
	cout << end - start << endl;
}

int main(int argc, char const *argv[])
{
	CreatePizza *cp = new CreateCheesePizza;
	CreatePizzaBridge *cpb = new CreatePizzaBridgeTimer(cp);
	cpb->makePizza(100, 20);
	return 0;
}

ピザ作る抽象クラス(CreatePizza)を用意し、それらを継承させた2つのクラス(CreateCheesePizzaとCreateSpicyPizza)に機能を追加をしたいという想定です。
橋渡し用のクラス(CreatePizzaBridge)にてCreatePizzaを保存し、CreatePizzaBridgeからピザを作るメソッドを呼び出します。
メソッド内で呼び出す前に、それらの機能とは別の機能を実装します(今回だと時間ですね)