En resumen, Bridge Design Pattern es una abstracción de dos capas.
El patrón de puente está destinado a «desacoplar una abstracción de su implementación para que los dos puedan variar de forma independiente». El puente usa encapsulación, agregación y puede usar herencia para separar responsabilidades en diferentes clases.
1. Historia del patrón de puente
El ejemplo de TV y control remoto (error tipográfico en el diagrama) puede demostrar las dos capas de abstracción. Tienes una interfaz para TV y una clase abstracta para control remoto. Como sabe, no es una buena idea hacer una clase concreta para ninguno de ellos, porque otros proveedores pueden realizar diferentes implementaciones.
2. Código Java de patrón de puente
Primero defina una interfaz de TV: ITV
public interface ITV { public void on(); public void off(); public void switchChannel(int channel); } |
Deje que Samsung implemente la interfaz ITV.
public class SamsungTV implements ITV { @Override public void on() { System.out.println("Samsung is turned on."); } @Override public void off() { System.out.println("Samsung is turned off."); } @Override public void switchChannel(int channel) { System.out.println("Samsung: channel - " + channel); } } |
Deje que Sony implemente la interfaz ITV.
public class SonyTV implements ITV { @Override public void on() { System.out.println("Sony is turned on."); } @Override public void off() { System.out.println("Sony is turned off."); } @Override public void switchChannel(int channel) { System.out.println("Sony: channel - " + channel); } } |
El control remoto tiene una referencia al televisor.
public abstract class AbstractRemoteControl { /** * @uml.property name="tv" * @uml.associationEnd */ private ITV tv; public AbstractRemoteControl(ITV tv){ this.tv = tv; } public void turnOn(){ tv.on(); } public void turnOff(){ tv.off(); } public void setChannel(int channel){ tv.switchChannel(channel); } } |
Defina una clase de control remoto concreta.
public class LogitechRemoteControl extends AbstractRemoteControl { public LogitechRemoteControl(ITV tv) { super(tv); } public void setChannelKeyboard(int channel){ setChannel(channel); System.out.println("Logitech use keyword to set channel."); } } |
public class Main { public static void main(String[] args){ ITV tv = new SonyTV(); LogitechRemoteControl lrc = new LogitechRemoteControl(tv); lrc.setChannelKeyboard(100); } } |
Producción:
Logitech usa la palabra clave para configurar el canal.
En resumen, el patrón Bridget permite dos capas de abstracción de implementación, en este caso, TV y control remoto. Por tanto, da más flexibilidad.
3. Patrón de puente en la plataforma Eclipse
El patrón de puente es uno importante que se utiliza en la arquitectura Eclipse.
Referencia:
1. Gamma, E, Helm, R, Johnson, R, Vlissides, J: Design Patterns, página 151. Addison-Wesley, 1995
2. Patrón de Puente Wiki