Intento
Disaccopia una astrazione dalla sua implementazione affiché le due possono variare indipendentemente.
Descrizione
Divide un componente complesso in due gerarchie collegate ma separate: l'astrazione funzionale e la rappresentazione interna.
Il Bridge Pattern è utile quando ci sono gerarchie di astrazioni e corrispondenti gerarchie di implementazioni.
Piuttosto che combinare le astrazioni e le implementazioni in molte classi distinte, il Bridge pattern implementa le astrazioni e le implementazioni sono classi indipendenti che possono essere combinate dinamicamente.
Per esempio: la specifica di servlet o JDBC e molte altre tecnologie Java, definiscono un set di interfacce la cui implementazione è delegata alla specifica implementazione.
Benefici- Permette di separare le interfacce dalle implementazioni
- Favorisce l'estensibilità
- Nasconde i dettagli implementativi al client
Quando usarlo- Si vuole avitare un legame permanente tra l'astrazione e la sua implementazione.
- L'astrazione e le sue implementazioni devono essere estensibili attraverso le sottoclassi.
- I cambiamenti nell'implementazione di una astrazione non devono avere impatto sui client; non devi cioè ricompilare il codice.
Esempio:
public class Client {
public static void main(String args[]) {
WindowImpl xImpl = new XWindowImpl();
WindowImpl pmImpl = new PMWindowImpl();
IconWindow iconWindow = new IconWindow(xImpl);
iconWindow.drawIconWindow();
TransientWindow transientWindow = new TransientWindow(xImpl);
transientWindow.drawTransientWindow();
iconWindow = new IconWindow(pmImpl);
iconWindow.drawIconWindow();
transientWindow = new TransientWindow(pmImpl);
transientWindow.drawTransientWindow();
}
}
|
/**
* @stereotype Implementor
*/
public interface WindowImpl {
public void drawRectangle();
public void drawText();
}
|
/**
* @stereotype Abstraction
*/
public class Window {
private WindowImpl implementation;
public Window(WindowImpl val) { implementation = val; }
public void drawRectangle() { implementation.drawRectangle(); }
public void drawText() { implementation.drawText(); }
}
|
/**
* @stereotype Refined Abstraction
*/
public class IconWindow extends Window {
public IconWindow(WindowImpl implementation) { super(implementation); }
public void drawIconWindow() {
drawRectangle();
drawText();
}
}
|
/**
* @stereotype Refined Abstraction
*/
public class TransientWindow extends Window {
public TransientWindow(WindowImpl implementation) {
super(implementation);
}
public void drawTransientWindow() {
drawRectangle();
}
}
|
/**
* @stereotype Concrete Implementor
*/
public class PMWindowImpl implements WindowImpl {
public void drawRectangle() {
System.out.println("Drawing PMWindow rectangle.");
}
public void drawText() {
System.out.println("Drawing PMWindow text.");
}
}
|
----
Bridge is mentioned on: StructuralPatterns