Was ist der Unterschied zwischen Fassade und Adaptermuster?


Antworten:


140

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.


4
Tolle Analogie mit Fernbedienung. Die Erklärung des Adaptermusters ist in Ordnung, aber es wäre großartig, die gleiche Analogie zu finden.
Kevin Le - Khnle

2
Hervorragende Analogie! Ein reales Java-Beispiel für das Adaptermuster kann helfen, es besser zu verstehen: InputStreamReaderWelches passt sich InputStreaman Readerund OutputStreamWriterwelches passt sich OutputStreaman WriterBeide an, die unterschiedliche abstrakte Typen sind.
BalusC


@Khnle - hinzugefügt in einer Adapter-Analogie (basierend auf persönlicher Erfahrung). @ Eric - danke für die Inspiration und das tolle Bild! @BalusC - guter Aufruf zum Beispiel der realen Welt.
awshepard

@ BalusC - Ich mag auch Ihr Beispiel. Zum Glück kenne ich Java. @ Eric Petroelje - Ein Bild sagt mehr als tausend Worte :-) @awshepard - wenn ich nicht programmiert habe, kann ich jetzt auch Ihrer Erklärung folgen :-)
Kevin Le - Khnle

124

Adapter == Ein quadratischer Stift passt in ein rundes Loch.

Facade == ein einziges Bedienfeld zum Ausführen aller internen Komponenten.


8
Diese Antwort ist perfekt! Ich nehme das in meine Musternotizen auf. :)
Joshua Dale

1
Größe in der Einfachheit
ein Mann

20

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.


18

Fassade:

Wichtige Erkenntnisse : (aus dem journaldev- Artikel von Pankaj Kumar)

  1. Das Fassadenmuster ist eher ein Helfer für Clientanwendungen
  2. Das Fassadenmuster kann zu jedem Zeitpunkt der Entwicklung angewendet werden, normalerweise wenn die Anzahl der Schnittstellen zunimmt und das System komplex wird .
  3. Subsystem-Schnittstellen kennen Facade nicht und sollten keinen Verweis auf die Facade-Schnittstelle haben
  4. Das Fassadenmuster sollte für ähnliche Arten von Schnittstellen angewendet werden . Der Zweck besteht darin, eine einzelne Schnittstelle anstelle mehrerer Schnittstellen bereitzustellen, die ähnliche Aufgaben ausführen

Fassadenklassendiagramm:

Geben Sie hier die Bildbeschreibung ein

Adapter:

  1. Es ist ein Strukturmuster
  2. Es ist nützlich, mit zwei inkompatiblen Schnittstellen zu arbeiten
  3. Es bringt Dinge zum Laufen, nachdem sie entworfen wurden

Klassendiagramm des Adapters:

Geben Sie hier die Bildbeschreibung ein

Weitere Details zu Adapter finden Sie in diesem SE-Beitrag:

Unterschied zwischen Brückenmuster und Adaptermuster

Hauptunterschiede:

  1. Facade definiert eine neue Schnittstelle, während Adapter eine alte Schnittstelle verwendet . Mit dem Adapter arbeiten zwei vorhandene Schnittstellen zusammen, anstatt eine völlig neue zu definieren
  2. Adapter und Fassade sind beide Wrapper; aber es sind verschiedene Arten von Verpackungen. Die Absicht von Facade ist es, eine einfachere Schnittstelle zu erstellen, und die Absicht von Adapter ist es, eine vorhandene Schnittstelle zu entwerfen

Schauen Sie sich zum besseren Verständnis auch den Artikel zur Quellenherstellung an .


Liebe es, Diagramme zu sehen! Nur eine Klarstellung: Wenn ich die Anzahl / Art der Parameter ändere, bedeutet das, dass es kein Adapter mehr ist? wie someMethod(int year, int month) wurde delegiert an someMethod(DateTime start, DateTime end)oder sagen wir someMethod()delegiert ansomeMethod(T param)
Jaime Sangcap

Wenn sich beide Methoden in derselben Klasse befinden, spricht man von Überladung. Wenn sie in verschiedenen Klassen sind, kann es adpater sein, wenn die Beziehung zwischen Adapter und Adaptee implementiert ist
Ravindra babu

Wirklich schöne Erklärung.
Duc Filan

14

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.



8

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                           |
+--------------------------------------------------------------+-----------------------------------------------+

4

Wie üblich gibt es Ähnlichkeiten zwischen mehreren Mustern. Aber ich würde es so sehen:

  • Eine Fassade wird verwendet, um eine gesamte Ebene zu kapseln und einige Methoden anzubieten, um "bequem" darauf zuzugreifen.
  • Es wird ein Adapter verwendet, bei dem zwei Komponenten bereits zusammenarbeiten sollten, jedoch nicht, nur aufgrund einiger "unwichtiger" Unterschiede in der Benutzeroberfläche.

1
Gute Erklärung. Dies ist das erste Mal, dass ich bei der Beschreibung des Adapters auf das Wort "unwichtige Unterschiede" stieß, was tatsächlich wahr ist
Sudara

4

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 CarKlasse 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 .


3

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.


3

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.


1

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 deviceum ein serial port, werden Sie ein benötigen USB-serial port adapter.


1

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.


1

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.


0

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.


0

Das Hauptziel des Fassadenmusters besteht darin, die Verwendung der Klasse oder des Subsystems zu vereinfachen, während das Hauptziel des Adaptermusters darin besteht, die Schnittstelle an die Erwartungen des Kunden anzupassen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.