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

has aimplemented byNotificationabstractionSenderimplementorEmail / SMSconcrete
Abstraction holds a reference to an implementor.

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 classes

Common 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.

More General articles