Heim > Java > javaLernprogramm > Was ist das Adaptermuster (Adapter) in Java? Adaptermuster (ausführliche Erklärung)

Was ist das Adaptermuster (Adapter) in Java? Adaptermuster (ausführliche Erklärung)

青灯夜游
Freigeben: 2018-10-18 16:14:19
nach vorne
8431 Leute haben es durchsucht

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);
    }

}
Nach dem Login kopieren

Mehrere häufig verwendete Modi

Modus 1: Es gibt eine Zielschnittstelle und eine vorhandene Methode

//目标接口
public interface TargetInterface {
    
    public String getMark();

    public String getInfo();

}
Nach dem Login kopieren
//已有类及方法
public class ExistClass {

    public String sayHello() {
        return "Hello";
    }
      
    public String sayWorld() {
        return "World";
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

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;
    }
    
}
Nach dem Login kopieren
//客户端调用
TargetInterface target = new ClassAdapter();
ClientInvoking.invoke(target);
Nach dem Login kopieren

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;
    }
    
}
Nach dem Login kopieren
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 dem Login kopieren

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);
    }

}
Nach dem Login kopieren
//目标类
public class Class {
    
    public String getMark() {
        return "yes";
    }

    public String getInfo() {
        return "no";
    }

}
Nach dem Login kopieren

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";
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
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;
    }
    
}
Nach dem Login kopieren
//客户端调用
TargetClass target = new ClassAdapter(new ExistClass());
ClientInvoking.invoke(target);
Nach dem Login kopieren

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);
    ...
}
Nach dem Login kopieren
//添加监听器的例子
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) {

    }
    ...
})
Nach dem Login kopieren
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-Tutorial

, Bootstrap-Video-Tutorial!

Das 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!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage