Facade
Provee una interfaz simplificada a un subsistema complejo.
Contexto
Tu app necesita usar 5 servicios para "publicar un post": validar, guardar, indexar, notificar, auditar. El controller termina conociendo todos ellos.
Problema
Acoplas la capa de transporte a un montón de servicios internos. Cualquier cambio rompe muchos puntos.
Solución
Una clase Facade ofrece un método PublishPost(...) y orquesta a los servicios. El cliente solo conoce la fachada.
#Ejemplo en C#
public class PostPublisher
{
private readonly IPostValidator _val;
private readonly IPostRepository _repo;
private readonly ISearchIndexer _idx;
private readonly INotifier _notify;
public PostPublisher(IPostValidator v, IPostRepository r, ISearchIndexer i, INotifier n)
=> (_val, _repo, _idx, _notify) = (v, r, i, n);
public async Task PublishAsync(Post post)
{
_val.Validate(post);
await _repo.SaveAsync(post);
await _idx.IndexAsync(post);
await _notify.NotifySubscribersAsync(post);
}
}Cuándo NO aplicarlo
Si la fachada se vuelve un God Object que sabe demasiado: divídela.
Tradeoffs
| Pro | Contra |
|---|---|
| Reduce acoplamiento del cliente | Puede ocultar la flexibilidad del subsistema |
#structural #gof #api