In diesem Artikel erfahren Sie, was das Adaptermuster (Adapter) in Java ist. Adaptermuster (ausführliche Erklärung). Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.
Zweck: Anpassen des Quelltyps an den Zieltyp, um den Anforderungen des Clients (Client) gerecht zu werden; hier betrachten wir den Aufrufer der Zielschnittstelle als Client
Verwendungsszenarien: In Szenarien, in denen der Typ vom Quelltyp in den Zieltyp konvertiert werden muss
Vorbedingungen : Bestehender Kunde
//Client 一个调用目标接口的方法 Class ClientInvoking { static void invoke(TargetInterface target) { String value = target.getMark(); System.out.println(value); } }
Mehrere häufig verwendete Modi
Modus 1: Es gibt eine Zielschnittstelle und eine vorhandene Methode
//目标接口 public interface TargetInterface { public String getMark(); public String getInfo(); }
//已有类及方法 public class ExistClass { public String sayHello() { return "Hello"; } public String sayWorld() { return "World"; } }
Wir gehen davon aus, dass die von ExistClass zurückgegebene Zeichenfolge genau das ist, was unser Client benötigt, aber der Client benötigt Es wird über ein Objekt vom Typ TargetInterface abgerufen. Daher müssen wir einen Weg finden, die vorhandene Klasse so anzupassen, dass sie den Anforderungen des Kunden gerecht wird. In diesem Modus gibt es zwei Anwendungslösungen:
Lösung 1. Klassenadaptermuster
//适配器 public class ClassAdapter extends ExistClass implements TargetInterface { public int getMark() { String value = this.sayHello(); return value; } public int getInfo() { String value = this.sayWorld(); return value; } }
//客户端调用 TargetInterface target = new ClassAdapter(); ClientInvoking.invoke(target);
Aus dem Konzept der Java-Schnittstelle ist ersichtlich, dass ClassAdapter als Implementierungsklasse von TargetInterface nach oben in den TargetInterface-Typ umgewandelt werden kann, um sich an die Bedürfnisse des Clients anzupassen.
Option 2. Objektadaptermuster
//适配器 public class ClassAdapter implements TargetInterface { private ExistClass exist; public ClassAdapter(ExistClass existClass) { this.exist = existClass; } public int getMark() { String value = exist.sayHello(); return value; } public int getInfo() { String value = exist.sayWorld(); return value; } }rrree
Diese Option ähnelt dem Klassenadaptermuster, außer dass sie keine Vererbung, sondern verwendet die Methode zum Halten von Objekten, flexibler und skalierbarer.
Modus 2: Es gibt keine Zielschnittstelle, aber eine Zielklasse und vorhandene Methoden
Überprüfen wir zunächst die Voraussetzungen Der Client wird wie folgt geändert:
//客户端调用 TargetInterface target = new ClassAdapter(new ExistClass()); ClientInvoking.invoke(target);
Nach der Änderung erfordert die Aufrufmethode ein Objekt der TargetClass-Klasse als Parameter; im Folgenden sind die Zielklasse und vorhandene Klassen aufgeführt
Class ClientInvoking { static void invoke(TargetClass target) { String value = target.getMark(); System.out.println(value); } }
//目标类 public class Class { public String getMark() { return "yes"; } public String getInfo() { return "no"; } }
Wir gehen davon aus, dass die von ExistClass zurückgegebene Zeichenfolge genau das ist, was unser Client verwenden muss, und der Inhalt des vom Client benötigten TargetClass-Objekts veraltet ist, sodass wir ExistClass entsprechend anpassen müssen Client.
//已有类及方法 public class ExistClass { public String sayHello() { return "Hello"; } public String sayWorld() { return "World"; } }rrree
In diesem Modus sind zwei Klassen erforderlich, und gemäß dem Einzelvererbungsmechanismus von Java können wir nur das Objekt halten durch Form, das Objektadaptermuster.
Modus 3: Standardadaptermodus
In diesem Modus gibt es keinen expliziten Zieltyp, sondern nur den Quelltyp Um dies zu verwenden, liegt dies häufig daran, dass der Quelltyp zu viele Dinge bereitstellt, die wir nicht benötigen, und wir ihn über den Adaptermodus anpassen müssen. Nehmen Sie WindowListener als Beispiel, um es zu erklären:
//适配器 public class ClassAdapter extends TargetClass { private ExistClass exist; public ClassAdapter(ExistClass existClass) { this.exist = existClass; } public int getMark() { String value = exist.sayHello(); return value; } public int getInfo() { String value = exist.sayWorld(); return value; } }
//客户端调用 TargetClass target = new ClassAdapter(new ExistClass()); ClientInvoking.invoke(target);
Code wie dieser scheint sehr umständlich zu sein; ich muss zum Beispiel nur das Abschlussereignis abhören, aber es wird viel Vorlagencode generiert hat damit nichts zu tun. Aus diesem Grund werden wir ihn anpassen und nur eine abstrakte Klasse anhören Implementieren Sie die Schnittstelle und stellen Sie allen Listenern eine leere Implementierung zur Verfügung. Verwenden Sie dann eine Unterklasse der abstrakten Klasse, um die Implementierung des Fensterschließers neu zu schreiben. Der Code lautet wie folgt:
//WindowListener源码 public interface WindowListener extends EventListener { public void windowOpened(WindowEvent e); public void windowClosing(WindowEvent e); public void windowClosed(WindowEvent e); ... }
//添加监听器的例子 Frame frame = new Frame(); frame.addWindowListener(new WindowListener() { @Override public void windowOpened(WindowEvent e) { } @Override public void windowClosing(WindowEvent e) { } @Override public void windowClosed(WindowEvent e) { } ... })rreee
Diese Methode vereinfacht die Schnittstelle und verbessert die Lesbarkeit des Codes. Das Wichtigste ist, dass wir die Anpassung der Benutzeroberfläche erkannt haben und nur die Dinge tun können, die uns wichtig sind.
Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Studium aller hilfreich sein wird. Weitere verwandte Tutorials finden Sie unter Java-Video-Tutorial,
Java-Entwicklungsgrafik-TutorialDas obige ist der detaillierte Inhalt vonWas ist das Adaptermuster (Adapter) in Java? Adaptermuster (ausführliche Erklärung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!