Design Pattern Facade: definición y ejemplo de implementación

Design Pattern Facade: definición y ejemplo de implementación

Emanuelly Leoncio. Los Patrones de diseño (o design patterns) son herramientas útiles para sistemas orientados a objetos. Su aplicación tiene como objetivo reutilizar soluciones de software estandarizadas en problemas rutinarios.

Uno de los 23 patrones documentados en el libro Design Patterns: Elements of Reusable Object-Oriented Software es el Patrón de Proyecto Facade. En este artículo detallaremos más al respecto.

Facade

Facade es uno de los patrones de diseño más populares. Como sugiere el nombre, se trata de una “fachada”, en la que se creará un objeto para facilitar el uso de un sistema complejo. El Facade es un patrón de tipo estructural, es decir, se utiliza para crear otras estructuras a partir del mismo. Así, permite organizar las clases y objetos del sistema de forma estructurada.

A pesar de que Facade tiene la encapsulación como característica, no se fija solo en una clase, que es lo más común. Puede abstraer completamente la complejidad de un módulo, creando una interfaz de uso más simplificada.

Visión estructural de Facade

Figura 1: Diagrama del Patrón de Proyecto Facade.


Facade accede a una parte específica del sistema, según la solicitud del cliente. Los subsistemas están "ocultos" y nos proporciona una interfaz más sencilla de manejar. El módulo Cliente interactúa sólo con el método Facade, no es necesario conocer las interacciones que se llevan a cabo “bajo el capó”.

Ejemplo de uso

Supongamos que estamos desarrollando un sistema de entrega de productos petshop en línea. El flujo desde la elección hasta la recepción del producto se realiza a través de:

  1. Inicio de la venta;
  2. Procesamiento del carrito de compras;
  3. Actualización del stock de la tienda;
  4. Preparación del envío de los productos;
  5. Envío de los productos para el cliente.

Así, disponemos de 5 servicios diferentes que se realizan en un completo proceso de compra. El cliente está vinculado a todos estos microservicios, lo que aumenta la complejidad del sistema.

De esta forma, la fachada se aplica como solución para abstraer nuestro sistema y hacerlo más flexible.

Figura 2: Diagrama de implementación de Facade.

Aplicación

La implementación de Facade para nuestro sistema de delivery de productos de petshop considera el siguiente código:

Subsistemas.php

<?php
class IniciaVenda {

  function init() {
      echo "Venda iniciada".PHP_EOL;
  }

  function getCarrinho() {
      return "carrinho";
  }
}

class Estoque {
  function atualizaEstoque() {
      echo "Estoque atualizado".PHP_EOL;
  }
}

class ProcessaCarrinho {

  function getPedido($carrinho) {
      echo "Pedido concluído com sucesso".PHP_EOL;

      return new Estoque();
  }
}


class PreparaProduto {
 
  function empacota($carrrinho) {
      echo "Preparando produto para envio".PHP_EOL;
  }
}

class EnviaProduto {

  function enviaPedido() {
      echo "Produto foi enviado ao destinatário".PHP_EOL;
  }
}
?>


Facade.php

<?php

include 'Subsistemas.php';

class VendaFacade {

  private $iniciapedido;
  private $estoque;
  private $processamento;
  private $empacota;
  private $envia;

  function __construct($iniciapedido, $processamento, $empacota, $envia) {
      $this->iniciapedido = $iniciapedido;
      $this->processamento = $processamento;
      $this->empacota = $empacota;
      $this->envia = $envia;
  }

  function cicloPedidoCompleto() {
      $this->iniciapedido->init();
      $carrinhoCliente = $this->iniciapedido->getCarrinho();
      $this->estoque = $this->processamento->getPedido($carrinhoCliente);
      $this->estoque->atualizaEstoque();
      $this->empacota->empacota($carrinhoCliente);
      $this->envia->enviaPedido();
  }
}

function realizarVenda() {
  $venda = new VendaFacade(new IniciaVenda(), new ProcessaCarrinho(), new PreparaProduto(), new EnviaProduto());

  $venda->cicloPedidoCompleto();
}

realizarVenda();
?>

Conclusión

Facade es un patrón de diseño simple de implementar. Debido a su estructura organizada, es fácil comprender las funcionalidades del sistema en cuestión.

Otra ventaja es la flexibilidad en relación a los cambios. Si es necesario cambiar algún subsistema, solo se modifica una clase.

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.