Intento:
Disaccoppiare l’astrazione dalla sua implementazione in modo tale che le due parti possano variare indipendentemente.
Applicabilità:
E’ utile sfruttare il pattern Bridge quando
- si vuole evitare un legame permanente fra implementazione ed astrazione. Per esempio implementazioni che devono essere cambiate a run-time
- sia le astrazioni che le implementazioni potrebbero essere estese dalla sotto-classificazione
- si vuole che cambiamenti a livello di implementazione non abbiano effetto sui Client
- (caso del C++) si vuole nascondere l’implementazione ai Client
- c’è una proliferazione di classi, e la gerarchia indica il bisogno di spezzare l’oggetto in due parti.
- si vuole condividere una implementazione per vari oggetti, e tale implementazione potrebbe essere nascosta ai Client
Partecipanti:
- Abstraction → definisce l’interfaccia dell’astrazione e mantiene il riferimento verso un oggetto di tipo Implementor
- RefinedAbstraction → estende l’interfaccia definita da Abstraction
- Implementor → definisce l’interfaccia per le classi di implementazione. Tale interfaccia non deve corrispondere appieno alla interfaccia di Abstraction. Solitamente l’interfaccia di Implementor fornisce solo le operazioni primitive, e Abstraction definisce operazioni di alto livello che sfruttano tali primitive.
- ConcreteImplemetor → implementa l’interfaccia di Implementor e definisce la sua concreta implementazione.
Conseguenze:
- c’è il disaccoppiamento fra implementazione e interfaccia
- viene accresciuta la capacita di estensione
- vengono nascosti i dettagli dell’implementazione ai Client









