Adapter-Muster
Das Adapter-Muster ermöglicht es zwei inkompatiblen Schnittstellen, zusammenzuarbeiten, indem eine davon in ein Übersetzerobjekt eingewickelt wird. Verwende es, wenn du eine Drittanbieter-Bibliothek, eine Legacy-Klasse oder eine API integrieren musst, deren Signatur nicht zu deinem Code passt.
Überblick
Das Adapter-Muster (auch Wrapper genannt) schlägt eine Brücke zwischen zwei Schnittstellen, die nie füreinander gedacht waren. Statt die Originalklasse umzuschreiben — die oft Drittanbieter-Code, Legacy oder einfach teuer zu ändern ist — baust du ein dünnes Objekt, das die von deinem Code erwartete Schnittstelle anbietet und intern an die existierende delegiert. Es ist der klassische Weg, einen eckigen Stift in ein rundes Loch zu stecken, ohne eine der beiden Seiten anzufassen.
Wann verwenden
- Du musst eine bestehende Klasse nutzen, aber ihre Schnittstelle passt nicht zu der, die dein Code erwartet.
- Du integrierst ein Drittanbieter-SDK oder ein Legacy-Modul, das du nicht (oder nicht solltest) ändern kannst.
- Du willst den Rest des Systems hinter einem stabilen internen Vertrag von einer instabilen externen API isolieren.
Beispiel
interface Logger {
log(message: string): void;
}
class ThirdPartyLogger {
writeMessage(level: string, payload: { msg: string }) {
console.log(`[${level}] ${payload.msg}`);
}
}
class ThirdPartyLoggerAdapter implements Logger {
constructor(private readonly external: ThirdPartyLogger) {}
log(message: string): void {
this.external.writeMessage("info", { msg: message });
}
}
const logger: Logger = new ThirdPartyLoggerAdapter(new ThirdPartyLogger());
logger.log("App gestartet");Vorteile
- Erlaubt die Wiederverwendung bestehenden Codes ohne Änderung.
- Entkoppelt deine Domäne von Legacy- oder Drittanbieter-APIs.
- Single Responsibility: Die Übersetzung lebt in einer klar benannten Klasse.
Nachteile
- Fügt eine zusätzliche Indirektionsschicht hinzu, die zusammen mit dem Original gepflegt werden muss.
- Ein bidirektionaler Adapter kann zu einem komplexen Kompromiss werden.
- Lässt sich leicht missbrauchen — manchmal ist das Refactoring des Aufrufers sauberer als das Wrappen des Aufgerufenen.