Bridge Design Pattern is a Structural Design Pattern used to decouple a class into two parts — abstraction and it’s implementation — so that both can be developed independently. This promotes the loose coupling between class abstraction & its implementation. You get this decoupling by adding one more level of indirection i.e. an interface which acts as a bridge between your original class & functionality. Insulation is another name of Bridge Design Pattern in C++ world.
“All problems in computer science can be solved by another level of indirection.” — David Wheeler
By the way, If you haven’t check out my other articles on Structural Design Patterns, then here is the list:
The code snippets you see throughout this series of articles are simplified not sophisticated. So you often see me not using keywords like override
, final
, public
(while inheritance) just to make code compact & consumable(most of the time) in single standard screen size. I also prefer struct
instead of class
just to save line by not writing “public:
” sometimes and also miss virtual destructor, constructor, copy constructor, prefix std::
, deleting dynamic memory, intentionally. I also consider myself a pragmatic person who wants to convey an idea in the simplest way possible rather than the standard way or using Jargons.
Note:
/!: This article has been originally published on my blog. If you are interested in receiving my latest articles, please sign up to my newsletter.
To separate the interface from its implementation.
Shape
and then the Shape
can be Circle
or Square
and it can also be drawn by API 1 or API 2.struct DrawingAPI_1 { };
struct DrawingAPI_2 { };
struct Shape { virtual void draw() = 0; };
/* 2 x 2 scenario */
struct Circle : Shape, DrawingAPI_1 { };
struct Circle : Shape, DrawingAPI_2 { };
struct Square : Shape, DrawingAPI_1 { };
struct Square : Shape, DrawingAPI_2 { };
Circle
with API_1
, Circle
with API_2
and so on.Circle
& Square
.struct DrawingAPI {
virtual void drawCircle() = 0;
};
struct DrawingAPI_1 : DrawingAPI {
void drawCircle() { cout << "Drawn by API 1"<< endl; }
};
struct DrawingAPI_2 : DrawingAPI {
void drawCircle() { cout << "Drawn by API 2"<< endl; }
};
struct Shape {
Shape(DrawingAPI &drawingAPI) : m_drawingAPI{drawingAPI} {}
virtual void draw() = 0;
protected:
DrawingAPI &m_drawingAPI; // Now Shapes does not need to worry about drawing APIs
};
struct Circle : Shape {
Circle(DrawingAPI &drawingAPI) : Shape{drawingAPI} {}
void draw() { m_drawingAPI.drawCircle(); }
};
int main() {
DrawingAPI_1 API_1;
DrawingAPI_2 API_2;
Circle(API_1).draw();
Circle(API_2).draw();
return EXIT_SUCCESS;
}
#design-patterns #cpp #software-development #programming #coding