Bridge Design Pattern Explained
Bridge decouples an abstraction from its implementation so the two can vary and evolve independently.
Published November 13, 2026
The Bridge pattern separates an abstraction from its implementation so each can vary independently, avoiding a class explosion from combining two dimensions of variation.
The concept
Without it, shapes × colours would need RedCircle, BlueCircle, RedSquare... With Bridge, Shape holds a Color object and both hierarchies grow separately.
The abstraction delegates the platform-specific work to an implementor interface.
Two hierarchies joined by composition
Practical examples
Sender implementors
class EmailSender { send(m) { /* smtp */ } }
class SmsSender { send(m) { /* gateway */ } }Abstractions use them
class Alert { constructor(sender) { this.sender = sender } fire(t) { this.sender.send('ALERT: ' + t) } }
class Reminder { constructor(sender) { this.sender = sender } fire(t) { this.sender.send('Reminder: ' + t) } }
new Alert(new SmsSender()).fire('disk full')Combinations without new classes
2 abstractions × 2 senders = 4 behaviours, 4 small classesCommon mistakes
- Using Bridge when only one dimension varies.
- Confusing it with Adapter.
- Over-engineering early.
Key takeaways
- Split abstraction and implementation.
- Avoids class explosion.
- Uses composition.
FAQ
Bridge vs Adapter?
Bridge is designed up front to decouple; Adapter fixes incompatibility after the fact.
Bridge vs Strategy?
Structurally similar; Bridge targets structure, Strategy targets algorithms.