💡 Ver Caso Práctico: Ejemplo Práctico del Patrón Bridge
Bridge (Puente) es un patrón de diseño estructural que divide una clase grande, o un grupo de clases estrechamente relacionadas, en dos jerarquías separadas —abstracción e implementación— que pueden desarrollarse independientemente.
Propósito y Caso de Uso
Utiliza Bridge cuando tengas una abstracción que puede tener varias implementaciones (ej. una notificación que puede enviarse por Email, SMS o Push) y quieras evitar una explosión combinatoria de subclases (UrgentEmailNotification, UrgentSmsNotification, NormalEmailNotification...). A diferencia del Patrón Adapter, que se aplica después de que el diseño ya existe para hacer compatibles interfaces incompatibles, Bridge se diseña de antemano para permitir que dos jerarquías evolucionen por separado.
Estructura del Patrón
- Abstracción: Define la interfaz de alto nivel y mantiene una referencia a un objeto Implementador.
- Abstracción Refinada: Extiende la abstracción con variantes (ej.
UrgentNotification). - Implementador: Interfaz común para todas las implementaciones concretas.
- Implementadores Concretos: Cada variante técnica (
EmailSender,SmsSender).
Flujo de Funcionamiento
- Composición, no herencia: La abstracción no hereda de la implementación, la contiene como campo.
- Delegación: Cada llamada de alto nivel (
notification.send()) delega en el método del implementador inyectado. - Combinación libre: Cualquier abstracción refinada funciona con cualquier implementador concreto, sin subclases cruzadas.
Ejemplos de Implementación Reales
// Implementador
interface Sender {
deliver(message: string): void;
}
class EmailSender implements Sender {
deliver(message: string): void { console.log(`Email: ${message}`); }
}
class SmsSender implements Sender {
deliver(message: string): void { console.log(`SMS: ${message}`); }
}
// Abstracción
class Notification {
constructor(protected sender: Sender) {}
send(message: string): void { this.sender.deliver(message); }
}
// Abstracción refinada
class UrgentNotification extends Notification {
send(message: string): void { this.sender.deliver(`🚨 URGENTE: ${message}`); }
}
// Cualquier combinación abstracción/implementador funciona sin subclases cruzadas
new UrgentNotification(new SmsSender()).send('Servidor caído');
new Notification(new EmailSender()).send('Recordatorio semanal');Cuándo NO usarlo
Si solo existe una implementación posible y no se prevé que cambie, Bridge introduce una capa de indirección sin beneficio real (YAGNIGlosarioYAGNI (You Aren't Gonna Need It)Principio de Extreme Programming (XP) que establece que un programador no debe añadir funcionalidad hasta que sea estrictamente necesario. Su objetivo es evitar la sobre-ingeniería (over-engineering), previniendo código para funcionalidades hipotéticas.Ver término completo →).