- 1. Ziele
- 2. Probleme
- 3. Diskussion
- 4. Struktur
- 5. Beispiel
- 6. Kontrollliste
- 7. Faustregeln
Ziele
- Konvertieren einer Klassenschnittstelle in eine andere Schnittstelle. Ein Adapter ermöglicht die Zusammenarbeit von Klassen, die andernfalls auf inkompatible Klassenschnittstellen zurückzuführen wären.
- Umhüllen einer bestehenden Klasse in eine neue Schnittstelle
- Übereinstimmung der alten Komponente mit dem neuen System
Probleme
Eine vorgefertigte Komponente enthält alles, was Sie zum Entwickeln Ihres Systems benötigen, aber ihre Schnittstellen sind nicht mit den Schnittstellen Ihrer Anwendungsklassen kompatibel.
Diskussion
Die Wiederverwendung war schon immer schmerzhaft. Einer der Gründe war das Problem, etwas Neues zu schaffen und gleichzeitig etwas Altes wiederzuverwenden. Zwischen Alt und Neu stimmt immer etwas nicht oder ist nicht ganz kompatibel. Es könnten physikalische Dimensionen sein. Es könnte synchron sein. Dies können unglückliche Annahmen oder konkurrierende Standards sein.
Dies ähnelt dem Problem, einen neuen dreipoligen elektrischen Stecker in eine alte zweipolige Steckdose einzustecken – es wird eine Art Adapter oder Zwischenstück benötigt.
Ein Adapter ist eine Kreation einer Zwischenabstraktion, die eine alte Komponente in ein neues System übersetzt oder abbildet. Clients rufen Methoden für das Adapterobjekt auf, die sie zu Aufrufen an die geerbte Bean umleiten. Diese Strategie kann entweder mit Vererbung oder Aggregation implementiert werden.
Der Adapter fungiert als Wrapper oder Modifikator für eine vorhandene Klasse. Es bietet eine andere oder übersetzte Darstellung dieser Klasse.
Struktur
Unten erwartet die veraltete display() -Methode für die Rectangle-Komponente, die im Rectangle verwendet wird, den Empfang von „x, y, w, h“-Parametern. Aber der Client möchte "oben links x und y" und "unten rechts x und y" übergeben. Diese Inkonsistenz kann korrigiert werden, indem eine zusätzliche Abstraktionsebene hinzugefügt wird – d. h. ein Adapterobjekt.
Den Adapter kann man sich auch als „Wrapper“ vorstellen.
Beispiel
Das Adaptermuster ermöglicht es anderen inkompatiblen Klassen, zusammenzuarbeiten, indem es die Schnittstelle einer Klasse in die von Clients erwartete Schnittstelle umwandelt. Buchsen sind ein Beispiel für einen Adapter. Die Nuss wird an der Ratsche befestigt, vorausgesetzt, dass die Größe des Betätigers gleich ist. Typische Scheibengrößen in den USA sind 1/2" und 1/4". Offensichtlich passt eine 1/2-Zoll-Ratsche nicht in eine 1/4-Zoll-Stecknuss, es sei denn, es wird ein Adapter verwendet. Der 1/2" auf 1/4" Adapter hat eine 1/2" Buchse zur Montage an einem 1/2" Shaker und einen 1/4" Stecker zur Montage an einer 1/4" Buchse.
Kontrollliste
- Definieren Sie die Akteure: die Komponente(n), die Sie verwenden möchten (d. h. Client) und die Komponente, die Sie anpassen möchten (d. h. anpassbar).
- Bestimmen Sie die Schnittstelle, die der Client benötigt.
- Erstellen Sie eine "Wrapper"-Klasse, die "mit der Schnittstelle" des Clients übereinstimmen kann.
- Die Adapter/Wrapper-Klasse "hat" eine Instanz der anzupassenden Klasse.
- Die Adapter-/Wrapper-Klasse "bildet" die Client-Schnittstelle auf die angepasste Schnittstelle ab.
- Der Client verwendet eine neue Schnittstelle
Faustregeln
- Adapter ermöglicht Klassen zu arbeiten, nachdem sie entworfen wurden; Die Brücke sorgt dafür, dass sie funktionieren, bevor sie entwickelt werden.
- Die Brücke wird im Voraus so entworfen, dass sich Abstraktion und Implementierung unabhängig voneinander ändern. Der Adapter wird aktualisiert, sodass kollaborative Klassen zusammenarbeiten.
- Ein Adapter bietet eine andere Schnittstelle zu seinem Objekt. Der Proxy bietet die gleiche Schnittstelle. Der Decorator bietet eine erweiterte Schnittstelle.
- Der Adapter wurde entwickelt, um die Schnittstelle eines vorhandenen Objekts zu ändern. Ein Decorator verbessert die Leistung eines anderen Objekts, ohne dessen Schnittstelle zu ändern. Der Dekorateur ist somit für die Anwendung transparenter als der Adapter. Folglich unterstützt der Decorator die rekursive Komposition, was mit reinen Adaptern nicht möglich ist.
- Fassade definiert eine neue Schnittstelle, während Adapter die alte Schnittstelle verwendet. Denken Sie daran, dass ein Adapter zwei vorhandene Schnittstellen unterstützt und keine völlig neue definiert.