Bridge (抽象側と実装側との橋渡し)

#include <iostream>
using namespace std;
 
// 実装側側面
class Drawing {
public:
	virtual void DrawLine() = 0;
	virtual void DrawCircle() = 0;
};
 
class NormalDrawing : public Drawing {
public:
	virtual void DrawLine() {
		cout << "-----" << endl;
	}
	virtual void DrawCircle() {
		cout << "ooooo" << endl;
	}
};
 
class BoldDrawing : public Drawing {
public:
	virtual void DrawLine() {
		cout << "=====" << endl;
	}
	virtual void DrawCircle() {
		cout << "OOOOO" << endl;
	}
};
 
 
// 抽象的側面
class Shape {
public:
	Shape(Drawing *drawing) {
		m_draw = drawing;
	}
	virtual void draw() = 0;
protected:
	void draw_line() {
		m_draw->DrawLine();
	}
	void draw_circle() {
		m_draw->DrawCircle();
	}
	Drawing *m_draw;
};
 
class Line : public Shape {
public:
	Line(Drawing *drawing) : Shape(drawing) { }
	virtual void draw() {
		draw_line();
	}
};
 
class Circle : public Shape {
public:
	Circle(Drawing *drawing) : Shape(drawing) { }
	virtual void draw() {
		draw_circle();
	}
};
 
 
int main(int argc, char **argv) {
	Drawing *drawing;
	if (argc == 1) {
		drawing = new NormalDrawing;
	} else {
		drawing = new BoldDrawing;
	}
#if 0
	Shape *shape = new Line(drawing);
#else
	Shape *shape = new Circle(drawing);
#endif
	shape->draw();
	delete drawing;
	delete shape;
	return 0;
}
 



参考サイト

デザインパターンを“喩え話”で分かり易く理解する
http://www.netlaputa.ne.jp/~hijk/study/oo/designpattern.html



デザインパターンの骸骨たち
http://www002.upp.so-net.ne.jp/ys_oota/mdp/
最終更新:2011年11月14日 00:20