Pular para o conteúdo

Boas práticas e padrões · Padrões estruturais · 4 min de leitura

Facade

Oferece uma porta de entrada simples para um subsistema complicado, escondendo a ordem das chamadas.

Tela → CheckoutFacade1CheckoutFacade → Estoque: reservarreservar2CheckoutFacade → Pagamento: cobrarcobrar3CheckoutFacade → Nota fiscal: emitiremitir4CheckoutFacade → Envio: agendaragendar5Tela — finalizar()Telafinalizar()CheckoutFacade — uma chamadaCheckoutFacadeuma chamadaEstoqueEstoquePagamentoPagamentoNota fiscalNota fiscalEnvioEnvio

Arraste para o lado para ver o diagrama inteiro.

A tela faz uma única chamada; a fachada conhece a ordem certa dos quatro subsistemas.

Quando usar

Quando um fluxo exige várias chamadas em ordem certa a classes diferentes (e o cliente erraria a ordem). A fachada não impede o acesso direto aos subsistemas — só oferece o caminho fácil para o caso comum.

Facade x caso de uso

Em arquiteturas com camada de domínio, o caso de uso (interactor) costuma cumprir o papel de fachada: FinalizarCompra coordena repositórios e serviços. Cuidado para a fachada não virar uma "classe deus" com todas as regras.

No código

✓ ExemploKotlin
class FinalizarCompra(
  private val estoque: Estoque,
  private val pagamento: Pagamento,
  private val fiscal: NotaFiscal,
  private val envio: Envio,
) {
  suspend operator fun invoke(c: Carrinho): Pedido {
    val reserva = estoque.reservar(c.itens)
    try {
      val recibo = pagamento.cobrar(c.total)
      val nota = fiscal.emitir(c, recibo)
      return envio.agendar(c, nota)
    } catch (e: Exception) {
      estoque.liberar(reserva) // compensação em caso de falha
      throw e
    }
  }
}

A tela chama finalizarCompra(carrinho). A ordem e a compensação (liberar o estoque se o pagamento falhar) vivem em um só lugar.

Em resumo

Referências

Continue aprendendo

Todos os temas de boas práticas e padrões →