Adapter-Muster

In der Computerprogrammierung ist das Adapter-Muster (häufig gekennzeichnet als das Streifband-Muster oder einfach ein Streifband) ein Designmuster, das eine Schnittstelle für eine Klasse in eine vereinbare Schnittstelle übersetzt. Ein Adapter erlaubt Klassen zusammenzuarbeiten, der normalerweise nicht wegen unvereinbarer Schnittstellen, durch die Versorgung seiner Schnittstelle Kunden gekonnt hat, während er die ursprüngliche Schnittstelle verwendet hat. Der Adapter übersetzt Anrufe zu seiner Schnittstelle in Anrufe zur ursprünglichen Schnittstelle und dem Betrag des Codes, der notwendig ist, um zu tun, das ist normalerweise klein. Der Adapter ist auch dafür verantwortlich, Daten in passende Formen umzugestalten. Zum Beispiel, wenn vielfach, boolean Werte werden als eine einzelne ganze Zahl versorgt (d. h. Fahnen), aber Ihr Kunde verlangt einen 'wahren'/'false' würde der Adapter dafür verantwortlich sein, die passenden Werte aus dem Wert der ganzen Zahl herauszuziehen. Ein anderes Beispiel gestaltet das Format von Daten um (z.B. YYYYMMDD zu MM/DD/YYYY oder DD/MM/YYYY).

Struktur

Es gibt zwei Typen von Adapter-Mustern:

Gegenstand-Adapter-Muster

In diesem Typ des Adapter-Musters enthält der Adapter ein Beispiel der Klasse, die es wickelt. In dieser Situation macht der Adapter Anrufe zum Beispiel des gewickelten Gegenstands.

Klassenadapter-Muster

Dieser Typ des Adapters verwendet vielfache polymorphe Schnittstellen, um sein Ziel zu erreichen. Der Adapter wird durch das Einführen oder das Übernehmen sowohl der Schnittstelle geschaffen, die erwartet wird als auch die Schnittstelle, die vorher existiert. Es ist für die erwartete Schnittstelle typisch, die als eine reine Schnittstelle-Klasse besonders auf Sprachen wie Java zu schaffen ist, die Mehrfachvererbung nicht unterstützen.

Das Adapter-Muster ist in Situationen nützlich, wo eine bereits vorhandene Klasse einigen oder allen Dienstleistungen zur Verfügung stellt, brauchen Sie, aber verwendet die Schnittstelle nicht, die Sie brauchen. Ein gutes echtes Lebensbeispiel ist ein Adapter, der die Schnittstelle eines Dokumentengegenstand-Modells eines XML Dokumentes in eine Baumstruktur umwandelt, die gezeigt werden kann. Eine Verbindung zu einem Tutorenkurs, der das Adapter-Designmuster verwendet, wird in den Verbindungen unten verzeichnet.

Eine weitere Form des Laufzeitadapter-Musters

Es gibt eine weitere Form des Laufzeitadapter-Musters wie folgt:

Es wird für classA gewünscht, um classB mit einigen Daten zu liefern, uns einige Schnur-Daten annehmen zu lassen. Eine Übersetzungszeit-Lösung ist:

classB.setStringData (classA.getStringData );

</Quelle>

Nehmen Sie jedoch an, dass das Format der Schnur-Daten geändert werden muss. Eine Übersetzungszeit-Lösung ist, Erbe zu verwenden:

Format1ClassA erweitert ClassA {\

öffentliche Schnur getStringData {\

geben Sie Format (toString ) zurück;

}\

}\</Quelle>

und schaffen Sie vielleicht den richtig "formatierenden" Gegenstand an der Durchlaufzeit mittels des Fabrikmusters.

Eine Lösung mit "Adaptern" geht wie folgt weiter:

(i) definieren Sie eine intermediäre "Versorger"-Schnittstelle, und schreiben Sie eine Durchführung dieser Versorger-Schnittstelle, die die Quelle der Daten, ClassA in diesem Beispiel und Produktionen die Daten formatiert als passend wickelt:

öffentliche Schnittstelle StringProvider {\

öffentliche Schnur getStringData ;

}\

öffentliche Klasse ClassAFormat1 führt StringProvider {\durch

ClassA classA;

öffentlicher ClassAFormat1 (ClassA classA) {\

this.classA = classA;

}\

öffentliche Schnur getStringData {\

geben Sie Format (classA.toString ) zurück;

}\}\</Quelle>

(ii) Schreiben Sie eine Adapter-Klasse, die die spezifische Durchführung des Versorgers zurückgibt:

öffentliche Klasse ClassAFormat1Adapter erweitert Adapter {\

öffentlicher Gegenstand passt sich an (Wenden Sie o ein) {\

geben Sie neuen ClassAFormat1 zurück ((ClassA) o);

}\

Publikum boolean isAdapterFor (Klasse c) {\

geben Sie c.equals (StringProvider.class) zurück;

}\}\</Quelle>

(iii) Schreiben Sie den Adapter mit einer globalen Registrierung ein, so dass der Adapter an der Durchlaufzeit nachgeschlagen werden kann:

AdapterFactory.getInstance .registerAdapter (ClassA.class, ClassAFormat1Adapter.class, "format1");

</Quelle>

(iv) In Ihrem Code, wenn Sie Daten von ClassA bis ClassB übertragen möchten, schreiben Sie:

Adapter-Adapter = AdapterFactory.getInstance .getAdapterFromTo (ClassA.class, StringProvider.class, "format1");

Versorger von StringProvider = (StringProvider) adapter.adapt (classA);

Schnur-Schnur = provider.getStringData ;

classB.setStringData (Schnur);

</Quelle>

oder kürzer:

classB.setStringData (((StringProvider) AdapterFactory.getInstance .getAdapterFromTo (ClassA.class, StringProvider.class, "format1").adapt (classA)).getStringData );

</Quelle>

(v) Der Vorteil kann darin gesehen werden, wenn er gewünscht wird, um die Daten in einem zweiten Format zu übertragen, dann den verschiedenen Adapter/Versorger nachzuschlagen:

Adapter-Adapter = AdapterFactory.getInstance .getAdapterFromTo (ClassA.class, StringProvider.class, "format2");

</Quelle>

(vi) Und wenn es zur Produktion die Daten von ClassA als, sagen wir, Bilddaten in der Klasse C gewünscht wird:

Adapter-Adapter = AdapterFactory.getInstance .getAdapterFromTo (ClassA.class, ImageProvider.class, "format1");

Versorger von ImageProvider = (ImageProvider) adapter.adapt (classA);

classC.setImage (provider.getImage );

</Quelle>

(vii) Auf diese Weise erlaubt der Gebrauch von Adaptern und Versorgern vielfache "Ansichten" durch ClassC und ClassC in ClassA, ohne die Klassenhierarchie verändern zu müssen. Im Allgemeinen erlaubt es einen Mechanismus für willkürliche Datenflüsse zwischen Gegenständen, die retrofitted zu einer vorhandenen Gegenstand-Hierarchie sein können.

Durchführung des Adapter-Musters

Wenn das Einführen des Adapter-Musters, für die Klarheit den Klassennamen [AdapteeClassName] verwendet, um Adapter, zum Beispiel DAOToProviderAdapter [Zu verbinden]. Es sollte eine Konstrukteur-Methode mit der adaptee Klassenvariable als Parameter haben. Dieser Parameter wird dem Beispiel-Mitglied von [AdapteeClassName] passiert, um Adapter [Zu verbinden].

Klasse SampleAdapter führt ClientClass durch

{\

privater AdapteeClass mInstance;

öffentlicher SampleAdapter (Beispiel von AdapteeClass)

{\

mInstance=instance;

}\

@Override

öffentlicher leerer ClientClassMethod

{\

//nennen Sie die Methode von AdapteeClass, ClientClassMethod durchzuführen

}\}\</Quelle>

Siehe auch

  • Streifband-Funktion
  • Delegation, die für das Gegenstand-Adapter-Muster stark wichtig ist.
  • Abhängigkeitsinversionsgrundsatz, von dem als Verwendung des Adapter-Musters gedacht werden kann, wenn die Klasse auf höchster Ebene ihr eigenes (Adapter) Schnittstelle zum auf niedriger Stufe Modul (durchgeführt durch eine Klasse von Adaptee) definiert.

Links


Source is a modification of the Wikipedia article Adapter pattern, licensed under CC-BY-SA. Full list of contributors here.
William Hope Hodgson / HMS Sidon
Impressum & Datenschutz