Intent
- Eine einheitliche Schnittstelle für eine Reihe von Schnittstellen in einem Subsystem bereitstellen.
- Ein kompliziertes Subsystem mit einer einfacheren Schnittstelle umhüllen.
Problem
Ein Teil der Kundengemeinschaft benötigt eine vereinfachte Schnittstelle zur Gesamtfunktionalität eines komplexen Subsystems.
Diskussion
Facade diskutiert die Kapselung eines komplexen Subsystems in einem einzigen Schnittstellenobjekt. Dies reduziert die Lernkurve, die notwendig ist, um das Subsystem erfolgreich zu nutzen. Es fördert auch die Entkopplung des Subsystems von seinen potentiell vielen Clients. Andererseits, wenn die Fassade der einzige Zugangspunkt für das Subsystem ist, wird sie die Funktionen und die Flexibilität einschränken, die „Power-User“ benötigen.
Das Fassadenobjekt sollte ein ziemlich einfacher Fürsprecher oder Vermittler sein. Es sollte kein allwissendes Orakel oder „Gott“-Objekt werden.
Struktur
Facade nimmt ein „Rätsel, das in ein geheimnisumwittertes Enigma eingewickelt ist“, und fügt eine Hülle ein, die die amorphe und undurchschaubare Masse der Software bändigt.
SubsystemOne
und SubsystemThree
interagieren nicht mit den internen Komponenten von SubsystemTwo
, sondern verwenden die SubsystemTwoWrapper
„Fassade“ (d.h. die Abstraktion auf höherer Ebene).
Beispiel
Die Fassade definiert eine einheitliche Schnittstelle auf höherer Ebene zu einem Subsystem, die dessen Verwendung erleichtert. Der Verbraucher trifft auf eine Fassade, wenn er aus einem Katalog bestellt. Der Verbraucher ruft eine Nummer an und spricht mit einem Kundenbetreuer. Der Kundenbetreuer fungiert als Fassade, die eine Schnittstelle zur Auftragsabwicklung, zur Rechnungsabteilung und zur Versandabteilung bildet.
Checkliste
- Eine einfachere, einheitliche Schnittstelle für das Teilsystem oder die Komponente identifizieren.
- Entwerfen Sie eine „Wrapper“-Klasse, die das Subsystem kapselt.
- Die Fassade/der Wrapper fängt die Komplexität und die Zusammenarbeit der Komponente ein und delegiert an die entsprechenden Methoden.
- Der Client verwendet (ist an) nur die Fassade.
- Überlegen Sie, ob zusätzliche Facades einen Mehrwert bringen würden.
Faustregeln
- Facade definiert eine neue Schnittstelle, während Adapter eine alte Schnittstelle verwendet.
- Erinnern Sie sich, dass Adapter zwei bestehende Schnittstellen zusammenarbeiten lassen, anstatt eine völlig neue zu definieren.
- Während Flyweight zeigt, wie man viele kleine Objekte erstellt, zeigt Facade, wie man ein einzelnes Objekt dazu bringt, ein ganzes Subsystem zu repräsentieren.
- Mediator ähnelt Facade insofern, als er die Funktionalität bestehender Klassen abstrahiert. Mediator abstrahiert/zentralisiert die beliebige Kommunikation zwischen Kollegenobjekten. Er fügt routinemäßig einen „Mehrwert“ hinzu und ist den Kollegenobjekten bekannt bzw. wird von ihnen referenziert. Im Gegensatz dazu definiert Facade eine einfachere Schnittstelle zu einem Subsystem, fügt keine neue Funktionalität hinzu und ist den Klassen des Subsystems nicht bekannt.
- Abstract Factory kann als Alternative zu Facade verwendet werden, um plattformspezifische Klassen zu verstecken.
- Facade-Objekte sind oft Singletons, da nur ein Facade-Objekt benötigt wird.
- Adapter und Facade sind beide Wrapper, aber sie sind unterschiedliche Arten von Wrappern. Die Absicht von Facade ist es, eine einfachere Schnittstelle zu erzeugen, und die Absicht von Adapter ist es, eine bestehende Schnittstelle zu entwerfen.Während Facade routinemäßig mehrere Objekte umhüllt und Adapter ein einzelnes Objekt umhüllt, könnte Facade ein einzelnes komplexes Objekt und Adapter mehrere Legacy-Objekte umhüllen.
Frage: Der Unterschied zwischen dem Adaptermuster und dem Fassadenmuster besteht also darin, dass der Adapter eine Klasse umhüllt und die Fassade viele Klassen darstellen kann?
Antwort: Nein! Denken Sie daran, dass das Adapter-Muster die Schnittstelle einer oder mehrerer Klassen in eine Schnittstelle umwandelt, die ein Client erwartet. Während die meisten Lehrbuchbeispiele zeigen, dass der Adapter eine Klasse anpasst, müssen Sie möglicherweise viele Klassen anpassen, um die Schnittstelle bereitzustellen, auf die ein Client kodiert ist. Ebenso kann eine Fassade eine vereinfachte Schnittstelle für eine einzelne Klasse mit einer sehr komplexen Schnittstelle bereitstellen. Der Unterschied zwischen den beiden liegt nicht darin, wie viele Klassen sie „umhüllen“, sondern in ihrer Absicht.
Unterstützen Sie unsere kostenlose Website und erwerben Sie das eBook!
- 22 Design Patterns und 8 Prinzipien ausführlich erklärt
- 406 gut strukturierte, leicht lesbare, jargonfreie Seiten
- 228 klare und hilfreiche Illustrationen und Diagramme
- Ein Archiv mit Codebeispielen in 4 Sprachen
- Alle Geräte werden unterstützt: EPUB/MOBI/PDF-Formate
Erfahren Sie mehr…