El patrón Facade
Descripción
El objetivo del patrón Facade es agrupar las interfaces de un conjunto de objetos en una interfaz unificada volviendo a este conjunto más fácil de usar por parte de un cliente.
El patrón Facade encapsula la interfaz de cada objeto considerada como interfaz de bajo nivel en una interfaz única de nivel más elevado. La construcción de la interfaz unificada puede necesitar implementar métodos destinados a componer las interfaces de bajo nivel.
Ejemplo
Queremos ofrecer la posibilidad de acceder al sistema de venta de vehículos como servicio web. El sistema está arquitecturizado bajo la forma de un conjunto de componentes que poseen su propia interfaz como:
-
El componente Catálogo.
-
El componente GestiónDocumento.
-
El componente RecogidaVehículo.
Es posible dar acceso al conjunto de la interfaz de estos componentes a los clientes del servicio web, aunque esta posibilidad presenta dos inconvenientes principales:
-
Algunas funcionalidades no las utilizan los clientes del servicio web, como por ejemplo las funcionalidades de visualización del catálogo.
-
La arquitectura interna del sistema responde a las exigencias de modularidad y evolución que no forman parte de las necesidades de los clientes del servicio web, para los que estas exigencias suponen una complejidad inútil.
El patrón Facade resuelve este problema proporcionando una interfaz unificada más sencilla y con un nivel de abstracción más elevado. Una clase se encarga de implementar esta interfaz unificada utilizando los componentes del sistema.
Esta solución se ilustra en la figura 3-6.1. La clase WebServiceAuto ofrece una interfaz a los clientes del servicio web. Esta clase y su interfaz constituyen una fachada de cara a los clientes.
La interfaz de la clase WebServiceAuto está constituida por el método buscaVehículos(precioMedio, desviaciónMax)...
Estructura
1. Diagrama de clases
La figura 3-6.2 detalla la estructura genérica del patrón.
Figura 3-6.2 - Estructura del patrón Facade
2. Participantes
Los participantes del patrón son los siguientes:
-
Fachada (WebServiceAuto) y su interfaz constituyen la parte abstracta expuesta a los clientes del sistema. Esta clase posee referencias hacia las clases y componentes que forman el sistema y cuyos métodos se utilizan en la fachada para implementar la interfaz unificada.
-
Las clases y componentes del sistema (RecogidaVehículo, GestiónDocumento y Catálogo) implementan las funcionalidades del sistema y responden a las consultas de la fachada. No necesitan a la fachada para trabajar.
3. Colaboraciones
Los clientes se comunican con el sistema a través de la fachada que se encarga, de forma interna, de invocar a las clases y los componentes del sistema. La fachada no puede limitarse a transmitir las invocaciones. También debe realizar la adaptación entre su interfaz y la interfaz de los objetos del sistema mediante código específico. El diagrama de secuencia de la figura 3-6.3 ilustra esta adaptación para un ejemplo cuyo código específico a la fachada debe ser invocado (métodos calcula1 y calcula2).
Los clientes que utilizan la fachada no deben acceder directamente a los objetos del sistema.
Figura 3-6.3 - Llamada al código específico necesaria para la adaptación...
Dominios de aplicación
El patrón se utiliza en los siguientes casos:
-
Para proveer una interfaz simple de un sistema complejo. La arquitectura de un sistema puede estar basada en numerosas clases pequeñas, que ofrecen una buena modularidad y capacidad de evolución. No obstante estas propiedades tan estupendas no interesan en absoluto a los clientes, que sólo necesitan un acceso simple que responda a sus exigencias.
-
Para dividir un sistema en subsistemas, la comunicación entre subsistemas se define de forma abstracta a su implementación gracias a las fachadas.
-
Para sistematizar la encapsulación de la implementación de un sistema de cara al exterior.
Ejemplo en Java
Retomamos el ejemplo del servicio web que vamos a simular con ayuda de un pequeño programa escrito en Java. Se muestra en primer lugar el código fuente de los componentes del sistema, comenzando por la clase ComponenteCatalogo y su interfaz Catalogo.
La base de datos que constituye el catálogo se reemplaza por una sencilla tabla de objetos. El método buscaVehiculos realiza la búsqueda de uno o de varios vehículos en función de su precio gracias a un simple bucle.
import java.util.*;
public interface Catalogo
{
List<String> buscaVehiculos(int precioMin, int
precioMax);
}
import java.util.*;
public class ComponenteCatalogo implements Catalogo
{
protected Object[] descripcionVehiculo =
{
"Berlina 5 puertas", 6000, "Compacto 3 puertas", 4000,
"Espace 5 puertas", 8000, "Break 5 puertas", 7000,
"Coupé 2 puertas", 9000, "Utilitario 3 puertas", 5000
};
public List<String> buscaVehiculos(int precioMin,
int...