Patrón Facade
El patrón Facade ofrece una interfaz simple y unificada sobre un subsistema complejo. Úsalo cuando un grupo de clases es difícil de usar directamente y solo quieres exponer las operaciones de alto nivel que el resto de la aplicación realmente necesita.
Resumen
El patrón Facade oculta un subsistema enredado tras una API única y estrecha. Los clientes llaman a uno o dos métodos en la fachada y nunca ven las decenas de clases que hay debajo; la fachada las orquesta. Es uno de los patrones más baratos de aplicar y de los más eficaces para domar código legado o envolver librerías pesadas que no quieres exponer al resto del código.
Cuándo usarlo
- Un subsistema tiene muchas piezas pero la mayoría de los consumidores solo necesita un subconjunto de operaciones.
- Quieres desacoplar al resto de la aplicación de una API interna compleja o inestable.
- Estás refactorizando código legado y quieres una costura estable detrás de la cual migrar de forma incremental.
Ejemplo
class VideoFile { constructor(public name: string) {} }
class Codec { constructor(public type: string) {} }
class CodecFactory { extract(file: VideoFile) { return new Codec("mp4"); } }
class BitrateReader { static read(file: VideoFile, codec: Codec) { return "raw"; } }
class AudioMixer { fix(buffer: string) { return "fixed"; } }
class VideoConverter {
convert(filename: string, format: string): string {
const file = new VideoFile(filename);
const sourceCodec = new CodecFactory().extract(file);
const buffer = BitrateReader.read(file, sourceCodec);
const result = new AudioMixer().fix(buffer);
return `${result}.${format}`;
}
}
const converted = new VideoConverter().convert("clip.ogg", "mp4");Ventajas
- Simplifica drásticamente la superficie de API que ven los clientes.
- Desacopla al consumidor de los detalles internos del subsistema.
- Excelente herramienta de migración: refactorizas por detrás sin romper a los llamadores.
Desventajas
- La fachada puede convertirse en un objeto-Dios si le sigues apilando responsabilidades.
- Esconde flexibilidad: quien necesite control fino tiene que esquivarla.
- Añade otra clase que hay que mantener sincronizada con el subsistema.