Design Pattern Facade: definição e exemplo de implementação

Design Pattern Facade: definição e exemplo de implementação

Emanuelly Leoncio. Os padrões de projeto (ou design patterns) são ferramentas úteis para sistemas orientados a objetos. A sua aplicação visa reutilizar soluções padronizadas de software em problemas rotineiros.

Um dos 23 padrões documentados no livro "Design Patterns: Elements of Reusable Object-Oriented Software" trata-se do Padrão de Projeto Facade. Neste artigo iremos detalhar mais sobre ele.

Facade

O Facade é um dos mais populares padrões de projeto. Como o próprio nome já indica, trata-se de uma “fachada”, no qual um objeto será criado para facilitar o uso de um sistema complexo. O Facade é um padrão do tipo estrutural, ou seja, é utilizado para criar outras estruturas a partir dele. Assim, permite organizar de forma estruturada as classes e objetos do sistema.

Apesar do Facade ter como característica o encapsulamento, ele não olha apenas para uma classe, que é o mais comum. Ele consegue abstrair a complexidade de um módulo por completo, criando uma interface mais simplificada para ser usada.

Visão estrutural do Facade

Figura 1: Diagrama do Padrão de Projeto Facade


O facade acessa uma parte específica no sistema, conforme a solicitação do cliente. Os subsistemas ficam “ocultos”, e ele nos fornece uma interface mais simples para lidar. O módulo Cliente interage apenas com o método Facade, não sendo necessário saber sobre as interações realizadas “por debaixo dos panos”.

Exemplo de uso

Suponhamos que estamos desenvolvendo um sistema de delivery de produtos de petshop online. O fluxo desde a escolha até o recebimento do produto se dá por:

  1. Início da venda;
  2. Processamento do carrinho de compras;
  3. Atualização do estoque da loja;
  4. Preparação do envio dos produtos;
  5. Envio dos produtos para o cliente.

Assim, temos 5 diferentes serviços que são executados em um processo de compra completo. O cliente está vinculado a todos estes microserviços, o que aumenta a complexidade do sistema.

Desta forma, o facade é aplicado como uma solução para abstrair nosso sistema e torná-lo mais flexível.

Figura 2: Diagrama de implementação do Facade

Aplicação

Implementando o facade para o nosso sistema de delivery de produtos de petshop, temos o seguinte 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();
?>

Conclusão

O facade é um padrão de projeto simples de ser implementado. Devido à sua estrutura organizada, tem um fácil entendimento sobre quais são as funcionalidades do sistema em questão.

Outra vantagem é a flexibilidade em relação a mudanças. Caso seja preciso alterar algum subsistema, somente uma classe é modificada.

💡
As opiniões e comentários expressos neste artigo são de propriedade exclusiva de seu autor e não representam necessariamente o ponto de vista da Revelo.

A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.