Bridge

Bridge è un design pattern strutturale. Si utilizza per variare non solo le implementazioni, ma anche le astrazioni.

Problema

Immaginiamo di dover scrivere il codice per un nuovo telecomando per TV, che sia ergonomico e user-friendly. Sappiamo già che dobbiamo usare delle buone tecniche di programmazione orientata agli oggetti, in quanto il telecomando si basa sulla stessa astrazione, ma ci saranno un sacco di implementazioni — una per ogni modello di TV.

Sappiamo già che la prima interfaccia utente del telecomando non sarà definitiva. Infatti, ci aspettiamo che il prodotto sia rifinito varie volte, man mano che i dati di usabilità sono raccolti.
Quindi, il nostro dilemma è che oltre alle TV, anche i telecomandi cambieranno. Col nostro design, abbiamo già astratto l’interfaccia utente, in modo tale da poter variare l’implementazione sulle varie TV possedute dai nostri clienti. Ma abbiamo bisogno di variare anche l’astrazione perché cambierà nel corso del tempo, con le migliorie apportate al telecomando, basate sui feedback degli utenti.
Dunque, come realizziamo un design orientato agli oggetti che ci permetta di variare l’implementazione e l’astrazione?

Soluzione

Il pattern Bridge ci consente di variare l’implementazione e l’astrazione piazzandole in due gerarchie di classi separate. La relazione tra le due è detta “bridge”.

A sinistra c’è la gerarchia delle classi dell’astrazione, a destra quella dell’implementazione. Tutti i metodi nell’astrazione (ad es. setChannel di RemoteControl) sono implementati in funzione dell’implementazione. Le sottoclassi concrete, invece, sono implementate in funzione dell’astrazione (ad es. il metodo nextChannel di ConcreteRemote).
Adesso abbiamo due gerarchie, una per i telecomandi e una per le implementazioni delle specifiche piattaforme TV. Bridge ci permette di variare uno dei due lati indipendentemente.

Conseguenze

Vantaggi:
• disaccoppia un’implementazione, affinché non sia accoppiata in modo permanente a un’interfaccia;
• l’astrazione e l’implementazione possono essere estese indipendentemente;
• i cambiamenti alle classi dell’astrazione concreta non hanno effetti sul client.

Utilizzi:
• sistemi grafici e con finestre che devono essere eseguiti in piattaforme multiple;
• è utile quando si vuole variare un’interfaccia e un’implementazione in modi differenti.

Svantaggi:
• aumenta la complessità.

Riferimenti

• Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides – Design Patterns. Elementi per il riuso di software a oggetti — © Pearson Education Inc. / © Pearson Paravia Bruno Mondadori, 1995-2008, pp. 151-161