El patrón Bridge
Descripción
El objetivo del patrón Bridge es separar el aspecto de implementación de un objeto de su aspecto de representación y de interfaz.
De este modo, por un lado la implementación puede encapsularse por completo y por otro lado la implementación y la representación pueden evolucionar de manera independiente y sin que ninguna suponga restricción alguna sobre la otra.
Ejemplo
Para realizar la solicitud de matriculación de un vehículo de ocasión, conviene precisar sobre esta solicitud cierta información importante como el número de placa existente. El sistema muestra un formulario para solicitar esta información.
Existen dos implementaciones de los formularios:
-
Formularios HTML
-
Formularios basados en un applet Java
Por tanto es posible introducir una clase abstracta FormularioMatriculación y dos subclases concretas FormularioMatriculaciónHtml y FormularioMatriculaciónApplet.
En una primera etapa, las solicitudes de matriculación sólo afectan a España. A continuación, se hace necesario introducir una nueva subclase de FormularioMatriculación correspondiente a las solicitudes de matriculación de Portugal, subclase llamada FormularioMatriculaciónPortugal. Esta subclase debe a su vez ser abstracta y tener dos subclases concretas por cada implementación. La figura 3-3.1 muestra el diagrama de clases correspondiente.
Figura 3-3.1 - Jerarquía de formularios integrando las subclases de implementación
Este diagrama pone de manifiesto dos problemas:
-
La jerarquía mezcla al mismo nivel subclases de implementación y una subclase de representación: FormularioMatriculaciónPortugal. Además para cada representación es preciso introducir dos subclases de implementación, lo cual...
Estructura
1. Diagrama de clases
La figura 3-3.3 detalla la estructura genérica del patrón.
Figura 3-3.3 - Estructura del patrón Bridge
2. Participantes
Los participantes del patrón son los siguientes:
-
ClaseAbstracta (FormularioMatriculación) es la clase abstracta que representa los objetos de dominio. Mantiene la interfaz para los clientes y contiene una referencia hacia un objeto que responde a la interfaz Implementación.
-
ClaseConcreta (FormularioMatriculaciónEspaña y FormularioMatriculaciónPortugal) es la clase concreta que implementa los métodos de ClaseAbstracta.
-
Implementación (FormularioImpl) define la interfaz de las clases de implementación. Los métodos de esta interfaz no deben corresponder con los métodos de ClaseAbstracta. Ambos conjuntos de métodos son diferentes. La implementación incluye por lo general métodos de bajo nivel y los métodos de ClaseAbstracta son de alto nivel.
-
ImplementaciónA, ImplementaciónB (FormHtmlImpl, FormAppletImpl) son clases concretas que realizan los métodos incluidos en la interfaz Implementación.
3. Colaboraciones
Las operaciones de ClaseAbstracta y de sus subclases invocan a los métodos incluidos en la interfaz Implementación.
Dominios de aplicación
El patrón se utiliza en los siguientes casos:
-
Para evitar que exista un vínculo demasiado fuerte entre la representación de los objetos y su implementación, en especial cuando la implementación se selecciona en el curso de ejecución de la aplicación.
-
Para que los cambios en la implementación de los objetos no tengan impacto en las interacciones entre los objetos y sus clientes.
-
Para permitir a la representación de los objetos y a su implementación conservar su capacidad de extensión mediante la creación de nuevas subclases.
-
Para evitar obtener jerarquías de clases demasiado complejas como ilustra la figura 3-3.1.
Ejemplo en Java
A continuación presentamos un ejemplo escrito en Java basado en el diagrama de clases de la figura 3-3.2.
Comenzamos por la interfaz que describe la implementación de los formularios que contienen dos métodos, uno para visualizar un texto y otro para administrar una zona concreta.
public interface FormularioImpl
{
void dibujaTexto(String texto);
String administraZonaIndicada();
}
Mostramos a continuación la clase de implementación FormHtmlImpl que simula la visualización y la introducción manual mediante un formulario HTML.
import java.util.*;
public class FormHtmlImpl implements FormularioImpl
{
Scanner reader = new Scanner(System.in);
public void dibujaTexto(String texto)
{
System.out.println("HTML: " + texto);
}
public String administraZonaIndicada()
{
return reader.next();
}
}
A continuación se detalla la clase de implementación FormAppletImpl que simula la visualización y la introducción manual mediante un formulario basado en un applet.
import java.util.Scanner;
public class FormAppletImpl implements FormularioImpl
{
Scanner reader = new Scanner(System.in);
public...