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