¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Design Patterns en PHP
  3. El patrón de diseño Facade
Extrait - Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición)
Extractos del libro
Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición) Volver a la página de compra del libro

El patrón de diseño Facade

Descripción

El objetivo del patrón de diseño Facade es agrupar las interfaces de un conjunto de objetos en una interfaz unificada volviendo a este conjunto más fácil de usar.

Ejemplo

Queremos ofrecer la posibilidad de acceder al sistema de venta de vehículos como servicio web. La arquitectura del sistema está formada por un conjunto de componentes donde cada uno posee su propia interfaz como:

  • el componente Catalogo,

  • el componente GestionDocumento.

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.

El patrón de diseño 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 14.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 buscaVehiculos(precioMedio, desviacionMax) cuyo código consiste en invocar al método encuentraVehiculos(precioMin, precioMax) del catálogo...

Estructura

1. Diagrama de clases

La figura 14.2 detalla la estructura genérica del patrón de diseño Facade.

images/fig417.PNG

Figura 14.2 - Estructura del patrón de diseño Facade

2. Participantes

Los participantes del patrón de diseño Facade 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 (GestionDocumento y Catalogo) 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 llamadas. 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 14.3 ilustra esta adaptación para un ejemplo cuyo código específico en 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.

images/fig418.PNG

Figura 14.3 - Llamada al código específico...

Dominios de aplicación

El patrón de diseño Facade utiliza en los siguientes casos:

  • Para proveer una interfaz simplificada 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 solo necesitan un acceso simple que responda a sus exigencias.

  • Para dividir un sistema en subsistemas, la comunicación entre subsistemas se define gracias a las fachadas.

  • Para sistematizar la encapsulación de la implementación de un sistema de cara al exterior.

Ejemplo en PHP

Retomamos el ejemplo del servicio web que vamos a simular con ayuda de un pequeño programa escrito en PHP. Se muestra en primer lugar el código fuente de los componentes del sistema, comenzando por la clase ComponenteCatalogo y su interfaz CatalogoInterfaz, así como la clase Vehiculo.

La base de datos que constituye el catálogo se reemplaza por una tabla de objetos de la clase Vehiculo. El método encuentraVehiculos realiza la búsqueda de uno o de varios vehículos en función de su precio gracias a un sencillo bucle foreach.

<?php 
 
declare(strict_types=1);  
 
namespace ENI\DesignPatterns\Facade; 
 
interface CatalogoInterfaz 
{ 
   public function encuentraVehiculos(float $precioMin, float 
$precioMax): array; 
} 
<?php 
 
declare(strict_types=1);  
 
namespace ENI\DesignPatterns\Facade; 
 
class ComponenteCatalogo implements CatalogoInterfaz 
{ 
   protected array $vehiculos; 
 
   public function __construct(array $vehiculos) 
   { 
       $this->vehiculos = $vehiculos; 
   } 
 
   public function encuentraVehiculos(float $precioMin, float 
$precioMax): array 
   { 
       $resultado = []; 
 
       foreach ($this->vehiculos as $vehiculo) { 
           $precio = $vehiculo->getPrecio();  
 
         if...