Design Pattern Facade em PHP : Exemplo prático
Por Paulo RB em 16/10/2024
O Design Pattern Facade é uma solução elegante para simplificar a interface de um subsistema complexo, tornando-o mais fácil de usar. Ele atua como uma fachada que esconde a complexidade de classes e interações internas, oferecendo uma interface simplificada para o cliente. Vamos explorar este padrão em PHP com exemplos práticos e sem a necessidade de bibliotecas externas.
Quando Usar o Facade?
- Quando você deseja oferecer uma interface simplificada para um sistema complexo.
- Quando várias classes e objetos precisam ser utilizados em conjunto, mas você quer minimizar o acoplamento do cliente a essas classes.
- Quando é necessário reduzir a complexidade das interações entre componentes.
Exemplo: Sistema de Pedidos
Imagine que estamos desenvolvendo um sistema de pedidos online. Ele envolve diferentes partes: processamento de pagamento, estoque e envio. Sem o Facade, o cliente precisaria interagir diretamente com cada uma dessas partes.
Vamos criar um exemplo de como seria sem o Facade, e depois aplicaremos o padrão para simplificar a interação.
Sem Facade:
class Estoque {
public function diminuirEstoque($produtoId, $quantidade) {
echo "Estoque reduzido para o produto $produtoId em $quantidade unidades.\n";
}
}
class Pagamento {
public function processarPagamento($valor) {
echo "Pagamento de R$$valor processado com sucesso.\n";
}
}
class Envio {
public function enviarProduto($produtoId) {
echo "Produto $produtoId enviado.\n";
}
}
// Cliente precisando lidar com tudo
$estoque = new Estoque();
$pagamento = new Pagamento();
$envio = new Envio();
// Fluxo de pedido
$estoque->diminuirEstoque(101, 2);
$pagamento->processarPagamento(150);
$envio->enviarProduto(101);
Neste exemplo, o cliente precisa conhecer e interagir diretamente com as classes Estoque, Pagamento e Envio, o que pode tornar o código difícil de gerenciar à medida que o sistema cresce.
Com Facade
Agora, vamos criar uma classe PedidoFacade para simplificar a interação.
class PedidoFacade {
protected $estoque;
protected $pagamento;
protected $envio;
public function __construct() {
$this->estoque = new Estoque();
$this->pagamento = new Pagamento();
$this->envio = new Envio();
}
public function processarPedido($produtoId, $quantidade, $valor) {
$this->estoque->diminuirEstoque($produtoId, $quantidade);
$this->pagamento->processarPagamento($valor);
$this->envio->enviarProduto($produtoId);
}
}
// Cliente agora só interage com o Facade
$pedidoFacade = new PedidoFacade();
$pedidoFacade->processarPedido(101, 2, 150);
Agora, o cliente precisa interagir apenas com o PedidoFacade, que esconde a complexidade do sistema. Isso torna o código mais limpo e fácil de manter.
Explicação
- Facade (
PedidoFacade): A classe PedidoFacade age como uma “fachada” para o subsistema de pedidos. Ela conhece os objetos internos (Estoque, Pagamento, Envio), mas o cliente não precisa se preocupar com eles.
- Subsistema: As classes
Estoque, Pagamento e Envio formam o subsistema que executa o trabalho real. Elas permanecem desacopladas e focadas em suas responsabilidades específicas.
Vantagens do Facade
- Simplicidade: O cliente interage com uma interface simplificada e não precisa se preocupar com a implementação dos componentes.
- Desacoplamento: O cliente não depende diretamente de várias classes. Mudanças internas no subsistema não afetam a interface exposta pelo
Facade.
- Manutenção: O código se torna mais fácil de manter, já que a complexidade interna fica encapsulada.
O padrão Facade é uma maneira eficaz de ocultar a complexidade de sistemas com múltiplas classes e responsabilidades, simplificando a interação para o cliente. Neste exemplo em PHP, criamos um sistema de pedidos onde o cliente interage com uma única classe (PedidoFacade), deixando todo o trabalho pesado para o subsistema. Este padrão ajuda a manter o código mais organizado e mais fácil de manter, especialmente em sistemas complexos.