Ich habe beide Definitionen gelesen und sie scheinen ziemlich gleich zu sein. Könnte jemand darauf hinweisen, was ihre Unterschiede sind?
Vielen Dank
Ich habe beide Definitionen gelesen und sie scheinen ziemlich gleich zu sein. Könnte jemand darauf hinweisen, was ihre Unterschiede sind?
Vielen Dank
Antworten:
Die Wiki-Seite Fassadenmuster enthält eine kurze Anmerkung dazu.
"Ein Adapter wird verwendet, wenn der Wrapper eine bestimmte Schnittstelle berücksichtigen und ein polymorphes Verhalten unterstützen muss. Andererseits wird eine Fassade verwendet, wenn eine einfachere oder einfachere Schnittstelle verwendet werden soll."
Ich habe eine Analogie gehört, dass Sie an Ihre Universalfernbedienung denken sollten, die Sie für die Arbeit mit all Ihren verschiedenen Stereoanlagen eingerichtet haben - Sie drücken "Ein" und sie schaltet Ihre Kabelbox, Ihren Receiver und Ihren Fernseher ein. Vielleicht ist es ein wirklich schickes Heimkino, das die Lichter dimmt und auch die Schatten zeichnet. Das ist eine Fassade - eine Taste / Funktion, die sich um kompliziertere Schritte kümmert.
Das Adaptermuster verbindet nur zwei inkompatible Schnittstellen.
BEARBEITEN: Eine schnelle Analogie für das Adaptermuster (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 Grafikkarte angeschlossen wird und über einen eigenen VGA-Eingang verfügt, können Sie Ihren alten Monitor mit Ihrer neuen Grafikkarte zum Laufen bringen.
InputStreamReader
Welches passt sich InputStream
an Reader
und OutputStreamWriter
welches passt sich OutputStream
an Writer
Beide an, die unterschiedliche abstrakte Typen sind.
Adapter == Ein quadratischer Stift passt in ein rundes Loch.
Facade == ein einziges Bedienfeld zum Ausführen aller internen Komponenten.
Ehrlich gesagt könnten viele Muster auf die gleiche Weise programmatisch implementiert werden - der Unterschied liegt in der Absicht.
Das Adapter-Entwurfsmuster soll die Schnittstelle einer oder mehrerer Klassen in eine Schnittstelle "übersetzen", die der Client voraussichtlich verwenden wird. Der Adapter übersetzt die Aufrufe der erwarteten Schnittstelle in die tatsächliche Schnittstelle, die die umschlossenen Klassen verwenden.
Das Fassadenmuster wird verwendet, wenn eine einfachere Benutzeroberfläche gewünscht wird (und könnte auf die gleiche Weise implementiert werden, indem die fehlerhaften 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 sie benötigen um es lesbarer, weniger schlecht gestaltet usw. zu machen.
Fassade:
Wichtige Erkenntnisse : (aus dem 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:
Schauen Sie sich zum besseren Verständnis auch den Artikel zur Quellenherstellung an .
someMethod(int year, int month)
wurde delegiert an someMethod(DateTime start, DateTime end)
oder sagen wir someMethod()
delegiert ansomeMethod(T param)
Eine Fassade dient zum Organisieren mehrerer Dienste hinter einem einzigen Dienstgateway. Ein Adapter bietet die Möglichkeit, über eine bekannte Schnittstelle auf eine unbekannte zuzugreifen.
Der Zweck eines
Fassade ist Einfachheit
Adapter ist Interoperabilität .
Fassade wird normalerweise mit Adapter kontrastiert.
+--------------------------------------------------------------+-----------------------------------------------+
| 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 |
+--------------------------------------------------------------+-----------------------------------------------+
Wie üblich gibt es Ähnlichkeiten zwischen mehreren Mustern. Aber ich würde es so sehen:
Ich werde versuchen, dies in einfachen Worten ohne viel Formalität zu erklären.
Stellen Sie sich vor, Sie haben einige Domänenklassen und möchten über die Benutzeroberfläche mit ihnen interagieren. Eine Fassade kann verwendet werden, um Funktionen bereitzustellen, die von der UI-Ebene aufgerufen werden können, sodass die UI-Ebene 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 für den Aufruf der erforderlichen Funktionen aus den anderen Klassen verantwortlich ist.
Ein Adapter kann andererseits verwendet werden, um andere externe Komponenten zu integrieren, die möglicherweise dieselbe Funktionalität haben, die Sie benötigen, deren Funktionen jedoch nicht ganz auf dieselbe Weise aufgerufen werden. Angenommen, Sie haben eine Car
Klasse in Ihrer Domain und arbeiten mit einem externen Fahrzeuganbieter zusammen, für den auch eine Fahrzeugklasse definiert ist. In dieser Klasse haben Sie die Funktion, car.getDoors()
aber der externe Anbieter hat die 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 Car-Klasse so zu verpacken, dass ein Aufruf getDoors()
des Adapters an getNumDoors()
die externe Klasse delegiert wird .
Mit dem Adaptermuster können zwei zuvor inkompatible Schnittstellen miteinander arbeiten. Hat 2 separate Schnittstellen im Spiel.
Das Fassadenmuster verwendet eine bekannte Schnittstelle, die niedrig / feinkörnig ist, und umschließt sie mit einer Schnittstelle mit höherer Ebene / Kurskörnung. Hat eine einzige Schnittstelle, die durch das Umschließen mit einer anderen vereinfacht wurde.
Mit dem Adapter arbeiten zwei Schnittstellen zusammen.
Facade setzt eine einzelne Klasse einer höheren und begrenzteren Ebene aus. Beispielsweise kann eine Fassade eines Ansichtsmodells nur bestimmte schreibgeschützte Eigenschaften einer untergeordneten Klasse verfügbar machen.
Fassade
Abstracts Komplexität, um eine einfachere Schnittstelle bereitzustellen. Angenommen, ein Computer-Betriebssystem abstrahiert die Komplexität der zugrunde liegenden Hardware. Oder eine Programmiersprache auf hoher Ebene (Python / JavaScript) abstrahiert die Komplexität im Vergleich zu einer Sprache auf niedriger Ebene (C).
Adapter
Es ist analog zu einem Hardware-Adapter. Sagen Sie bitte eine Verbindung herstellen möchten , USB device
um ein serial port
, werden Sie ein benötigen USB-serial port adapter
.
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.
Der Unterschied zwischen diesen beiden Mustern ist klar, jedoch nicht im Bereich der Entwurfsmuster, sondern im Bereich der Domänenmodellierung. Im Folgenden werde ich erklären, warum.
Zuerst möchte ich wiederholen, was andere hier gesagt haben, und dann werde ich den Hinweis hinzufügen:
Eine Fassade ist eine Schnittstelle zu einem Subsystem (einem externen oder einem Legacy-System), das den Zugriff für den Kunden (uns) vereinfacht. Facade verbirgt die Schnittstelle des anderen Subsystems (aggregieren Sie einige Aufrufe oder verbergen Sie einige APIs, die wir nicht benötigen), sodass Ihr Client nur über diese Facade auf dieses Subsystem zugreift.
Andererseits ist ein Adapter ein Wrapper um einen anderen Dienst oder ein anderes Objekt. Dadurch wird das umschlossene Objekt an eine vom Client erwartete Standardschnittstelle angepasst. Angenommen, es gibt eine Methode für das Objekt "Ledger", die Sie anpassen müssen (ändern Sie die Parameter, ändern Sie den Namen usw.). Sie können es mit einem Adapter umwickeln.
Jetzt ist der Unterschied möglicherweise noch nicht klar. Hier möchte ich den Hauptunterschied zwischen diesen beiden Mustern ansprechen und keinen Raum für weitere Verwirrung lassen :
Facade ändert das Domänenmodell des anderen Subsystems nicht, während Adapter dies tut. Dies ist der Hauptunterschied. Zeitraum.
Deshalb kombinieren Sie diese beiden, wenn Sie eine Antikorruptionsschicht erstellen . Angenommen, Sie haben ein Subsystem, das Sie verwenden möchten, aber Sie möchten nicht, dass das Domänenmodell Ihr Domänenmodell durcheinander bringt. Was würden Sie tun? Sie würden eine Antikorruptionsschicht erstellen. Wie? Sie erstellen zunächst eine Fassade, die den Zugriff auf die Schnittstelle für das Subsystem vereinfacht, und dann Adapter für die in dieser Schnittstelle verwendeten Domänenobjekte (denken Sie daran, dass die Fassade weiterhin das Domänenmodell für das andere Subsystem enthält), damit es Ihrem Modell entspricht.
Viele Entwurfsmuster können bei der Domänenmodellierung verwendet werden. Dies gilt auch für Fassaden- und Adapterdesignmuster. Obwohl der Unterschied zwischen diesen beiden Mustern im Bereich "Entwurfsmuster" möglicherweise nicht klar ist, ist er im Bereich "Domänenmodellierung" deutlicher.
Ich habe beide Definitionen gelesen und sie scheinen ziemlich gleich zu sein.
Ja wirklich ?
Mir ist aufgefallen, dass der Begriff Adapter manchmal verwendet wird, um zu beschreiben, was tatsächlich eine Strategie ist , vielleicht weil das Wort ausdrucksvoller ist.
In Zend Framework sind beispielsweise alle Adapterklassen tatsächlich Implementierungen des Strategiemusters , da sie nur nativen Code hinter Klassen einschließen, um verschiedene Verhaltensweisen zu haben.
Adapter werden häufig zum Umschließen von Legacy- oder "altmodischem" Code verwendet.