Facade-Muster
Das Facade-Muster bietet eine einfache, einheitliche Schnittstelle zu einem komplexen Subsystem. Verwende es, wenn eine Gruppe von Klassen schwer direkt zu nutzen ist und du nur die Operationen auf hoher Ebene exponieren willst, die der Rest der Anwendung tatsächlich braucht.
Überblick
Das Facade-Muster verbirgt ein verflochtenes Subsystem hinter einer einzigen, schmalen API. Aufrufer rufen ein oder zwei Methoden auf der Fassade auf und sehen niemals die Dutzenden Klassen darunter; die Fassade orchestriert sie. Es ist eines der billigsten Muster zum Anwenden und eines der wirkungsvollsten, um Legacy-Code zu zähmen oder eine schwere Bibliothek zu umhüllen, die du dem Rest des Codes lieber nicht zeigen möchtest.
Wann verwenden
- Ein Subsystem hat viele bewegliche Teile, aber die meisten Aufrufer brauchen nur eine kleine Teilmenge der Operationen.
- Du willst den Rest der Anwendung von einer komplexen oder instabilen internen API entkoppeln.
- Du refaktorisierst Legacy-Code und willst eine stabile Naht, hinter der du schrittweise migrieren kannst.
Beispiel
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");Vorteile
- Vereinfacht drastisch die API-Oberfläche, die Aufrufer sehen.
- Entkoppelt Aufrufer von internen Subsystemdetails.
- Großartiges Migrationswerkzeug — refaktoriere hinter der Fassade, ohne Aufrufer zu brechen.
Nachteile
- Die Fassade kann zu einem "Gott-Objekt" werden, wenn man immer mehr Verantwortung hineinstopft.
- Verbirgt Flexibilität: Wer feinere Kontrolle braucht, muss sie umgehen.
- Fügt eine weitere Klasse hinzu, die mit dem darunterliegenden Subsystem synchron gehalten werden muss.