What It Is
The Bridge pattern splits one concept into two independent dimensions so they can vary separately. Shapes and ways of drawing them; messages and ways of sending them.
Without the bridge you get one class per combination — VectorCircle, TextCircle, VectorSquare... — and the list multiplies. With the bridge, one side holds an interface to the other: any shape works with any renderer.
Example: Shapes and Renderers
2 renderers × 2 shapes would be 4 combined classes; here it is 2 + 2, connected by one interface property — the bridge.
Any shape, any renderer
The same circle draws itself two ways just by holding a different renderer. Adding a renderer or a shape adds one class, never a whole row of combinations.
Output: PHP script
<?php
// One dimension: HOW to draw.
interface Renderer {
public function draw(string $name): string;
}
class VectorRenderer implements Renderer {
public function draw(string $name): string {
return "drawing " . $name . " with smooth vector lines";
}
}
class TextRenderer implements Renderer {
public function draw(string $name): string {
return "drawing " . $name . " with text characters";
}
}
// Other dimension: WHAT to draw. The renderer property is the bridge.
class Shape {
public function __construct(
private string $name,
private Renderer $renderer,
) {}
public function draw(): string {
return $this->renderer->draw($this->name);
}
}
$shapes = [
new Shape("circle", new VectorRenderer()),
new Shape("circle", new TextRenderer()),
new Shape("square", new VectorRenderer()),
];
foreach ($shapes as $s) {
echo $s->draw(), "\n";
}
When to Use It
Use it when you notice combination explosion: every new kind on one axis forces new classes on the other. Two independent axes — split them.
Skip it when one dimension has exactly one implementation. A bridge to a single shore is just a pier.
Pros and Cons
Pros: the two sides grow independently; combinations come free; each side is testable alone.
Cons: more indirection up front; recognizing the two axes early is genuinely hard — splitting too early creates abstraction nobody needs.