Facade
O Facade fornece uma interface simples para um sistema complexo.
Imagine um processo de compra:
Validar estoque
Processar pagamento
Calcular frete
Criar pedido
Enviar email
O cliente não deveria precisar conhecer todos esses serviços.
Sem Facade:
inventory.check();
payment.process();
shipping.calculate();
order.create();
email.send();
Isso deixa o código cliente muito acoplado.
Criamos uma Facade:
class CheckoutFacade {
constructor(
private inventory: Inventory,
private payment: Payment,
private shipping: Shipping,
private order: Order
) {}
checkout(
productId: string,
amount: number
) {
this.inventory.check(
productId
);
this.payment.process(
amount
);
this.shipping.calculate();
this.order.create(
productId
);
}
}
Agora o cliente faz apenas:
const checkout =
new CheckoutFacade(
inventory,
payment,
shipping,
order
);
checkout.checkout(
"product-123",
100
);
O cliente conhece apenas:
CheckoutFacade
E não precisa conhecer todos os subsistemas.
Exemplo real
Uma Facade é muito comum em APIs.
Por exemplo:
class UserService {
async register(
data: UserData
) {
const user =
await database.createUser(
data
);
await email.sendWelcome(
user.email
);
await analytics.track(
"user_created"
);
return user;
}
}
O Controller chama:
userService.register(
data
);
O Controller não precisa saber todos os detalhes internos.
Quando usar?
Facade é útil quando:
- Um sistema possui muitos subsistemas.
- Queremos simplificar uma API complexa.
- Precisamos reduzir acoplamento.
- Queremos criar uma entrada única para uma operação complexa.
A ideia principal é:
Esconder a complexidade de um sistema atrás de uma interface simples.