Ich habe beide Definitionen gelesen und sie scheinen ziemlich gleich zu sein. Könnte jemand auf die Unterschiede hinweisen?
Vielen Dank
Die Facade Pattern Wiki-Seite enthält eine kurze Anmerkung dazu.
"Ein Adapter wird verwendet, wenn der Wrapper Eine bestimmte Schnittstelle Berücksichtigen muss und ein polymorphes Verhalten unterstützen muss. Andererseits wird eine Fassade Verwendet, wenn ein einfacher oder einfachere Schnittstelle zum Arbeiten. "
Ich habe eine Analogie gehört, die Sie an Ihre Universalfernbedienung denken sollten, die Sie für die Zusammenarbeit mit Ihren verschiedenen Stereoanlagen eingerichtet haben. Sie drücken "Ein" und schalten Ihre Kabelbox, Ihren Receiver und Ihr Fernsehgerät ein. Vielleicht ist es ein wirklich schickes Heimkino und dimmt das Licht und zieht auch die Schatten. Das ist eine Fassade - eine Taste/Funktion, die kompliziertere Schritte erledigt.
Das Adapter-Muster verbindet nur zwei inkompatible Schnittstellen.
EDIT: Eine schnelle Analogie für das Adapter-Pattern (basierend auf den Kommentaren) könnte so etwas wie ein DVI-zu-VGA-Adapter sein. Moderne Grafikkarten sind oft DVI, aber Sie haben einen alten VGA-Monitor. Mit einem Adapter, der an den erwarteten DVI-Eingang Ihrer Videokarte angeschlossen wird, und einen eigenen VGA-Eingang, können Sie Ihren alten Monitor mit Ihrer neuen Videokarte zum Laufen bringen.
Adapter == einen quadratischen Stift in ein rundes Loch einpassen.
Facade == ein einziges Control Panel, um alle internen Komponenten auszuführen.
Ehrlich gesagt, viele Muster könnten programmgesteuert auf dieselbe Weise implementiert werden - der Unterschied liegt in der Absicht.
Das Adapter-Entwurfsmuster soll die Schnittstelle einer oder mehrerer Klassen in eine vom Client erwartete Schnittstelle "übersetzen". Der Adapter würde die Aufrufe der erwarteten Schnittstelle in die tatsächliche Schnittstelle übersetzen, die die umschlossenen Klassen verwenden.
Das Fassadenmuster wird verwendet, wenn eine einfachere Benutzeroberfläche gewünscht wird (und wiederum könnte auf dieselbe Weise implementiert werden, indem die betreffenden Klassen umbrochen werden.) Sie würden nicht sagen, dass Sie eine Fassade verwenden, wenn die vorhandene Benutzeroberfläche nicht kompatibel ist, genau dann, wenn Sie dies benötigen um es lesbarer zu machen, weniger schlecht gestaltet usw.
Fassade:
Schlüssel zum Mitnehmen: (von journaldev Artikel von Pankaj Kumar)
Fassadenklassendiagramm:
Adapter:
Klassendiagramm des Adapters:
Weitere Details zu Adapter finden Sie in diesem SE-Beitrag:
Unterschied zwischen Brückenmuster und Adaptermuster
Hauptunterschiede:
Werfen Sie einen Blick auf Sourcemaking Artikel zum besseren Verständnis.
Eine Fassade ist dafür ausgelegt, mehrere Dienste hinter einem einzigen Dienst-Gateway zu organisieren. Ein Adapter bietet die Möglichkeit, eine bekannte Schnittstelle für den Zugriff auf eine unbekannte Schnittstelle zu verwenden.
Fassade wird normalerweise mit Adapter verglichen.
+--------------------------------------------------------------+-----------------------------------------------+
| Facade | Adapter |
+--------------------------------------------------------------+-----------------------------------------------+
| Simplifies multiple complex components with single interface | Provides differnet interface for an interface |
| Works with multiple components | Works with single component |
| Control panel is an example | A power adapter is an example |
| High-level interface | Low-level interface |
+--------------------------------------------------------------+-----------------------------------------------+
Ich werde versuchen, dies mit einfachen Worten zu erklären, ohne viel Formalität.
Stellen Sie sich vor, Sie verfügen über einige Domänenklassen und möchten über die Benutzeroberfläche mit ihnen interagieren. Mit einer Fassade können Funktionen bereitgestellt werden, die von der Benutzeroberflächenschicht aus aufgerufen werden können, sodass die Benutzeroberflächenschicht keine anderen Domänenklassen als die Fassade kennt. Das heißt, anstatt die Funktionen in den Domänenklassen aufzurufen, rufen Sie eine einzelne Funktion von der Fassade aus auf, die dafür verantwortlich ist, die benötigten Funktionen von den anderen Klassen aufzurufen.
Ein Adapter hingegen kann verwendet werden, um andere externe Komponenten zu integrieren, die möglicherweise die gleiche Funktionalität haben, die Sie benötigen, deren Funktionen jedoch nicht auf die gleiche Art und Weise aufgerufen werden. Angenommen, Sie haben eine Car
-Klasse in Ihrer Domain und arbeiten mit einem externen Autoanbieter zusammen, für den ebenfalls eine Car-Klasse definiert ist. In dieser Klasse haben Sie die Funktion car.getDoors()
, aber der externe Anbieter hat das entsprechende car.getNumDoors()
. Sie möchten die Art und Weise, wie Sie diese Funktion aufrufen, nicht ändern. Sie können also eine Adapterklasse verwenden, um die externe Autoklasse einzuhüllen, sodass ein Aufruf an getDoors()
des Adapters an getNumDoors()
der externen Klasse delegiert wird.
Wie üblich gibt es Ähnlichkeiten zwischen mehreren Mustern. Aber ich würde es so sehen:
Das Adaptermuster ermöglicht die Zusammenarbeit zweier zuvor nicht kompatibler Schnittstellen. Hat 2 separate Schnittstellen im Spiel.
Das Facade-Muster nimmt eine bekannte Schnittstelle mit geringer Körnung/feiner Körnung an und hüllt diese mit einer Oberfläche mit höherer Körnung/körniger Struktur ein. Hat eine einzige Schnittstelle, die durch das Umwickeln mit einer anderen Schnittstelle vereinfacht wurde.
Mit dem Adapter arbeiten zwei Schnittstellen zusammen.
Fassade macht eine einzelne Klasse einem höheren und begrenzten Niveau zugänglich. Beispielsweise kann eine Ansichtsmodellfassade nur bestimmte schreibgeschützte Eigenschaften einer untergeordneten Klasse offenlegen.
Nachdem ich all das gelesen habe, muss ich sagen, dass der Zweck von a
Fassade ist Einfachheit
adapter ist Interoperabilität .
Ich habe beide Definitionen gelesen und sie scheinen ziemlich gleich zu sein.
Ja wirklich ?
Ich habe bemerkt, dass der Begriff Adapter manchmal verwendet wird, um zu beschreiben, was in Wirklichkeit eine Stategy ist, vielleicht weil das Wort ausdrucksstärker ist.
In Zend Framework sind beispielsweise alle Adapter -Klassen Implementierungen des Strategy - Musters, da sie nur nativen Code hinter Klassen einfassen, um mehrere Verhalten zu haben.
Adapter werden häufig verwendet, um älteren Code oder Code "old style" zu verpacken.
Das Adaptermuster verbindet zwei inkompatible Schnittstellen, indem eine neue Schnittstelle bereitgestellt wird.
Das Fassadenmuster vereinfacht ein komplexes Subsystem (mit mehreren Komponenten) mit einer einzigen Schnittstelle.
Fassade
Zusammenfassung der Komplexität, um eine einfachere Schnittstelle bereitzustellen. Angenommen, ein Computer-Betriebssystem abstrahiert die Komplexität der zugrunde liegenden Hardware. Oder eine höhere Programmiersprache (Python/JavaScript) abstrahiert die Komplexität im Vergleich zu einer einfachen Sprache (C).
Adapter
Es ist analog zu einem Hardware-Adapter. Angenommen, Sie möchten einen USB device
mit einem serial port
verbinden, benötigen Sie einen USB-serial port adapter
.