DesignPattern Bridge(新しく機能を追加したい貴方へ)
Sponsored Links
皆さんこんにちは
お元気ですか。ねむい
さて、本日はDesign Patternについて
前回までは製造関係のデザインパターンの解説を行っていました。
今回からは構築についてのパターンを学習します。
Bridgeとは
日本語訳で「橋」ですね。つまりつなぐことかな
例えば、ある2つの物を作り、そこに更に何か機能を付け加えたい時に
新しくクラスを作り、機能を増設します。
このようにすることにより、元のクラスを弄ることなく
新しいクラスを追加することを可能とします。
クラス図
ソースコード
ピザ作ってたけど時間もはかりたいんだよーという処理
#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からピザを作るメソッドを呼び出します。
メソッド内で呼び出す前に、それらの機能とは別の機能を実装します(今回だと時間ですね)