In diesem Artikel werden hauptsächlich die Adaptermusternotizen des Java-Entwurfsmusters ausführlich vorgestellt, die einen gewissen Referenzwert haben. Interessierte Freunde können sich auf das
Adaptermuster beziehen:
Das Adaptermuster wandelt die Schnittstelle einer Klasse in eine andere vom Client erwartete Schnittstelle um und ermöglicht so die Zusammenarbeit zweier Klassen, die ursprünglich aufgrund nicht übereinstimmender Schnittstellen nicht zusammenarbeiten konnten.
Szenen aus dem Leben:
1. Laptop-Netzteil, das 220 V in eine für Laptops geeignete Spannung umwandeln kann.
2. Stecken Sie die Tastatur der Desktop-PS/2-Schnittstelle in die USB-Schnittstelle des Laptops. Zu diesem Zeitpunkt benötigen Sie den USB- und PS/2-Schnittstellenadapter fungiert als Adapter.
Allgemeines Klassendiagramm:
Im obigen allgemeinen Klassendiagramm die Cient-Klasse Am Ende stehen wir vor der Target-Schnittstelle (oder abstrakten Klasse), die nur Unterklassen verwenden kann, die diesem Zielstandard entsprechen, und die Adaptee-Klasse ist das angepasste Objekt (auch Quellrolle genannt), da es bestimmte Operationen, Funktionen usw. enthält. usw., daher möchten wir es in unserem eigenen System verwenden und in eine Klasse konvertieren, die unseren Standards entspricht, sodass die Client-Klasse transparent wählen kann, ob sie die ConcreteTarget-Klasse oder die Adaptee-Klasse mit speziellen Funktionen verwenden möchte.
Rolle im Adaptermuster:
Zielschnittstelle (Target): Die Schnittstelle, die Kunden erwarten. Das Ziel kann eine konkrete oder abstrakte Klasse oder eine Schnittstelle sein.
Klasse, die angepasst werden muss (Adaptee): Schnittstelle oder Adaptionsklasse, die angepasst werden muss.
Adapter: Die Adapterklasse ist der Kern dieses Musters. Der Adapter wandelt die Quellschnittstelle in die Zielschnittstelle um, indem er ein anzupassendes Objekt umschließt. Offensichtlich kann diese Rolle keine Schnittstelle sein, sondern muss eine konkrete Klasse sein.
Die Struktur des Adaptermusters:
Das Adaptermuster hat zwei verschiedene Formen: Klassenadaptermuster und Objektadaptermuster.
Das Adaptermuster einer Klasse wandelt die API der adaptierenden Klasse in die API der Zielklasse um.
Das Objektadaptermuster ist dasselbe wie das Klassenadaptermuster. Das Objektadaptermuster konvertiert die API der angepassten Klasse in die API der Zielklasse Verwenden Sie eine Vererbungsbeziehung, um eine Verbindung zur Adaptee-Klasse herzustellen, verwenden Sie jedoch eine Delegationsbeziehung, um eine Verbindung zur Adaptee-Klasse herzustellen.
Klassenadaptermuster
1. Erstellen Sie eine angepasste Klasse:
/** * 被适配的类 * 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 * (相当于例子中的,PS/2键盘) * @author ChuanChen * */ public class Adaptee { public void specificRequest(){ System.out.println("可以完成客户请求的需要的功能!"); } }
2. Erstellen Sie eine Zielschnittstelle, die einige spezielle Anforderungen verarbeiten kann
/** * 目标接口,或称为标准接口 * @author ChuanChen * */ public interface Target { void handleReq(); }
3. Erstellen Sie einen Adapter (Klassenadaptermethode)
/** * 适配器 (类适配器方式) * (相当于usb和ps/2的转接器) * @author ChuanChen * */ public class Adapter extends Adaptee implements Target { @Override public void handleReq() { super.specificRequest(); } }
4. Erstellen Sie einen Client
/** * 客户端类 * (相当于例子中的笔记本,只有USB接口) * @author ChuanChen * */ public class Client { public void test(Target t){ t.handleReq(); } public static void main(String[] args) { Client c = new Client(); Adaptee a = new Adaptee(); Target t = new Adapter(); c.test(t); } }
Der oben implementierte Adapter wird als Klassenadapter bezeichnet, da die Adapter-Klasse auch Adaptee (Adapted-Klasse) erbt implementiert die Target-Schnittstelle (da Java keine Mehrfachvererbung unterstützt und daher auf diese Weise implementiert wird, können wir jede Unterklasse auswählen und erstellen, die den Anforderungen zur Implementierung bestimmter Funktionen entspricht).
Adaptermuster von Objekten
1. Erstellen Sie eine angepasste Klasse:
/** * 被适配的类 * 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 * (相当于例子中的,PS/2键盘) * @author ChuanChen * */ public class Adaptee { public void specificRequest(){ System.out.println("可以完成客户请求的需要的功能!"); } }
2 einige Sonderwünsche
/** * 目标接口,或称为标准接口 * @author ChuanChen * */ public interface Target { void handleReq(); }
3. Erstellen Sie einen Adapter (Objektadaptermethode, verwenden Sie eine Kombinationsmethode zur Integration mit dem angepassten Objekt)
/** * 适配器 (对象适配器方式,使用了组合的方式跟被适配对象整合) * (相当于usb和ps/2的转接器) * @author ChuanChen * */ public class Adapter implements Target{ private Adaptee adaptee; @Override public void handleReq() { adaptee.specificRequest(); } public Adapter(Adaptee adaptee) { super(); this.adaptee = adaptee; } }
4. Erstellen Sie einen Client
/** * 客户端类 * (相当于例子中的笔记本,只有USB接口) * @author ChuanChen * */ public class Client { public void test(Target t){ t.handleReq(); } public static void main(String[] args) { Client c = new Client(); Adaptee a = new Adaptee(); Target t = new Adapter(a); c.test(t); } }
Wir müssen nur die interne Struktur der Adapterklasse, also des Adapters, ändern Es muss zunächst ein Objekt der angepassten Klasse besitzen und dann zur Implementierung bestimmte Sonderfunktionen an dieses Objekt delegieren. Mithilfe des Objektadaptermodus kann die Adapterklasse (Anpassungsklasse) basierend auf dem eingehenden Adaptee-Objekt an mehrere verschiedene angepasste Klassen angepasst werden. Natürlich können wir zu diesem Zeitpunkt eine Schnittstelle für mehrere angepasste Klassen oder abstrakte Klassen extrahieren. Es scheint, dass das Objektadaptermuster flexibler ist.
Kompromiss zwischen Klassenadapter und Objektadapter:
Der Klassenadapter verwendet die Objektvererbung, eine statische Definitionsmethode, während der Objektadapter verwendet wird verwendet Die Art und Weise, wie Objekte kombiniert werden, ist eine dynamische Kombination.
Da der Adapter Adaptee direkt erbt, kann der Adapter nicht mit Unterklassen von Adaptee arbeiten, da die Vererbung eine statische Beziehung ist. Wenn der Adapter Adaptee erbt, wird dies möglicherweise nicht der Fall sein Ich werde mich noch einmal mit Unterklassen von Adaptee befassen.
Bei Objektadaptern kann ein Adapter mehrere verschiedene Quellen an dasselbe Ziel anpassen. Mit anderen Worten: Derselbe Adapter kann sowohl die Quellklasse als auch ihre Unterklassen an die Zielschnittstelle anpassen. Da der Objektadapter die Beziehung der Objektkombination verwendet, spielt es keine Rolle, ob es sich um eine Unterklasse handelt oder nicht, solange der Objekttyp korrekt ist.
Bei Klassenadaptern kann der Adapter einen Teil des Verhaltens von Adaptee neu definieren, was dem Überschreiben einiger Implementierungsmethoden der übergeordneten Klasse durch die Unterklasse entspricht.
Für Objektadapter ist es schwierig, das Verhalten von Adaptee neu zu definieren. In diesem Fall müssen Sie eine Unterklasse von Adaptee definieren, um die Neudefinition zu implementieren, und den Adapter dann kombinieren lassen Unterklassen. Obwohl es schwierig ist, das Verhalten von Adaptee neu zu definieren, ist es sehr praktisch, einige neue Verhaltensweisen hinzuzufügen, und die neu hinzugefügten Verhaltensweisen können gleichzeitig auf alle Quellen angewendet werden.
Für Klassenadapter wird nur ein Objekt eingeführt und es sind keine zusätzlichen Referenzen erforderlich, um den Adaptee indirekt zu erhalten.
Für Objektadapter sind zusätzliche Referenzen erforderlich, um den Adaptee indirekt zu erhalten.
Es wird empfohlen, so weit wie möglich die Objektadapterimplementierung zu verwenden und dabei mehr Zusammensetzung/Aggregation und weniger Vererbung zu verwenden. Natürlich sollten spezifische Probleme im Detail analysiert und die Implementierungsmethode entsprechend den Anforderungen ausgewählt werden. Die am besten geeignete Methode ist die beste.
Vorteile des Adaptermusters:
Bessere Wiederverwendbarkeit:
Das System muss vorhandene Klassen verwenden, und die Schnittstelle dieser Klasse entspricht nicht den Anforderungen des Systems. Dann können diese Funktionen durch den Adaptermodus besser wiederverwendet werden.
Bessere Skalierbarkeit:
Bei der Implementierung der Adapterfunktion können Sie Ihre eigenen entwickelten Funktionen aufrufen. Dies erweitert sich natürlich die Funktionalität des Systems.
Nachteile des Adaptermodus
Die übermäßige Verwendung von Adaptern führt dazu, dass das System als Ganzes sehr unübersichtlich und schwer zu verstehen ist. Beispielsweise ist es offensichtlich, dass Schnittstelle A aufgerufen wird, aber tatsächlich ist sie intern angepasst, um Schnittstelle B zu implementieren. Wenn dies in einem System zu häufig vorkommt, kommt es einer Katastrophe gleich. Wenn dies nicht erforderlich ist, können Sie das System daher direkt ohne Verwendung des Adapters rekonstruieren.
Szenarien des Adaptermodus bei der Arbeit:
1. Die Schnittstelle der vorhandenen Klasse entspricht nicht unseren Anforderungen.
2 dass die Klasse mit anderen nicht verwandten Klassen oder unvorhergesehenen Klassen zusammenarbeiten kann (d. h. Klassen, deren Schnittstellen möglicherweise nicht unbedingt kompatibel sind);
3. Verwenden Sie im Fall von Schnittstellen eine vorhandene Unterklasse.
Der Adaptermodus wird häufig zum Nachrüsten und Aufrüsten alter Systeme verwendet. Wenn unser System nach der Entwicklung nie gewartet werden muss, sind viele Muster unnötig. Doch leider sind die Kosten für die Wartung eines Systems oft um ein Vielfaches höher als für die Entwicklung eines Systems.
Das obige ist der detaillierte Inhalt vonIllustration des Adaptermusters in Java Design Patterns. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!