Dank "Android -Quellcode -Design -Musteranalyse und praktischer Praxis" sorgte er Honghui um die Menschen
Der Adaptermodus ist in unserer Entwicklung äußerst nützlich. Es kann an den Adaptern beurteilt werden, die überall im Code zu sehen sind. Aus den frühesten ListView, GridView und der neuesten Recyclerview müssen wir alle Adapter verwenden, und die Optimierungsprobleme und Orte mit hoher Wahrscheinlichkeit von Fehlern, denen wir in der Entwicklung begegnen, werden im Grunde genommen von Adaptern abgeleitet.
Adapter sollen zwei inkompatible Feuerdrachen zusammen verschmelzen und eine Transformation verwenden, um die Zusammenarbeit zu ermöglichen. Zum Beispiel wird häufig auftreten, dass Sie zwischen zwei nicht verwandten Typen interagieren möchten. Die erste Lösung besteht darin, die Schnittstellen jeder Klasse zu ändern. Wenn es jedoch keinen Quellcode gibt oder wir nicht bereit sind, ihre jeweiligen Schnittstellen für eine Anwendung zu ändern, verwenden wir in diesem Fall häufig einen Adapter, der diese beiden Schnittstellen kompatibel ist und die Anforderungen entspricht, ohne den ursprünglichen Code zu ändern.
Angenommen, es gibt bereits ein Softwaresystem, und Sie möchten, dass es mit einer neuen Klassenbibliothek eines neuen Herstellers verwendet wird. Die von diesem neue Hersteller entworfene Schnittstelle wird jedoch nicht für die Schnittstelle des alten Herstellers verwendet:
Was sollten Sie tun, wenn Sie den vorhandenen Code nicht ändern und dieses Problem lösen möchten (und Sie können den Code des Herstellers nicht ändern)? Sie können eine Klasse (Adapter) schreiben, die die neue Anbieterschnittstelle in die von Ihnen erwartete Schnittstelle umwandelt. Dieser Adapter funktioniert wie ein Vermittler, der die vom Kunden ausgestellten Anfragen in Anfragen umwandelt, die die Anbieterklasse verstehen kann.
Adaptermodi können in zwei Typen unterteilt werden:
Objektadapter: voller guter OO -Designprinzipien. Unter Verwendung von Objektkombinationen kann es als Schnittstelle und alle Unterklassen auf den Adapter angewendet werden. Die Adaptermethode kann nicht umschreiben, da es keine Vererbungsbeziehung gibt, aber auch die Methode im Adapter "neu auf" neu auf "neu eingestuft" kann. Der Kunde und der Adapter sind völlig irrelevant, und nur der Adapter hat Verweise auf den Adapter.
Klassenadapter: Verwenden Sie die Vererbung, um die Arbeit von Adapter zu erreichen. Nur der Adapter ist eine Schnittstelle und kann seine Subklass -Schnittstelle nicht verwenden. Wenn der Klassenadapter festgelegt ist, ist er statisch mit dem Adapter verbunden. Der Adapter dient als Basisklasse des Adapters, sodass der Adapter die Methoden im Adapter umschreiben kann. Der Client -Code ist für den im Adapter deklarierten Code sichtbar. Der Client -Code ist für den im Adapter deklarierten Code sichtbar.
Definition:
Das Adaptermuster verwandelt die Schnittstelle einer Klasse in eine andere Schnittstelle, die der Client erwartet, so dass zwei Klassen, die ursprünglich aufgrund der Fehlanpassung der Schnittstelle zusammenarbeiten konnten, zusammenarbeiten können.
Szenarien verwenden:
1. Das System muss vorhandene Klassen verwenden, und solche Schnittstellen entsprechen den Anforderungen des Systems nicht, dh die Schnittstellen sind nicht kompatibel.
2. Möchten Sie eine Klasse erstellen, die wiederverwendet werden kann, um mit einigen Klassen zu arbeiten, die nicht sehr miteinander verbunden sind, einschließlich einiger Klassen, die in Zukunft möglicherweise eingeführt werden können.
3.. Eine einheitliche Ausgangsschnittstelle ist erforderlich, und der Typ des Eingangsende ist unvorhersehbar.
UML -Klassendiagramm:
Schauen Sie sich zunächst die folgenden Adapter an:
Klassenadapter implementieren die Interface Conversion durch Implementierung der Zielschnittstelle und Erben der Adaptinenklasse. Zum Beispiel erfordert die Zielschnittstelle Operation2, das Adaptierteobjekt hat jedoch nur einen Operation3, sodass inkompatiblen Situationen vorhanden sind. Zu diesem Zeitpunkt wird eine Operation2 -Funktion über Adapter implementiert, um den Operation3 -Betrieb3 von Adaptiv in Betrieb2 zu konvertieren, um die Kompatibilität zu erreichen.
Ziel: Die Zielrolle, dh die Schnittstelle, nach der Sie suchen. Hinweis: Da hier das Klassenadaptermuster diskutiert wird, kann das Ziel keine Klasse sein.
Adaptierte: Die angepasste Schnittstelle ist nun erforderlich.
Adapter: Die Adapterrolle ist auch der Kern dieses Modus. Der Adapter wandelt die Quellschnittstelle in die Zielschnittstelle um. Diese Rolle kann keine Schnittstelle sein, sondern muss eine bestimmte Klasse sein.
Beispiel für Klassenadaptermodus:
Nehmen Sie die Festlandspannung 220 V und die Mobiltelefonspannung beträgt 5 V als Beispiel
/** * Spannungsklassenziel Ziel * @author Administrator * */public Interface Spannung {public int getVoltage ();} öffentliche Klasse Chinavoltage Implements Spannung {@Override public int getVoltage () {// Continental Spannung ist 220 return 220; }} <pre name = "code">/** * Mobiltelefonklasse, Adapter -Adapterklasse * @Author Administrator * */public class Telefonvoltage {/** * Mobiltelefonspannung ist 5V * @return */public int getphonevoltage () {return 5; }} <pre name = "code">/** * Charger Adapter Administrator * */Public Class Ladegerät erweitert PhoneVoltage implementiert Spannung {@Override public int getVoltage () {return getphoneVoltage (); }} public class Client {public static void main (String [] args) {chinavoltage vol = new chinavoltage (); System.out.println ("Die Festlandspannung ist:" + vol.getVoltage ()); // die Spannung beim Anschließen des Ladegeräts mit dem Mobiltelefon Chargerr Charakter = New Chargerr (); System.out.println ("Spannung durch das Ladegerät umgewandelt:" + charakter.getVoltage ()); }} Auslaufergebnisse:
Die Spannung auf dem chinesischen Festland ist: 220
Spannung durch das Ladegerät umgewandelt: 5
Schauen wir uns das Objektadapterklassendiagramm an:
Im Folgenden wird die Ladegerätklasse mit dem Objektadapter geändert
<pre name = "code">/** * Ladegerät Adapter Administrator * * */Public Class Chargerr implementiert Spannung {private Telefonvoltage Telefonv; public Chargerr (Telefonvoltage Telefonv) {this.phonev = Telefonv; } @Override public int getVoltage () {return melV.GetoneVoltage (); }}Die Implementierungsmethode für Objektadapter übergibt das zu adaptierte Objekt direkt in den Adapter und verwendet eine kombinierte Form, um den Effekt der Schnittstellenkompatibilität zu erreichen. Dies ist flexibler als die Klassenadaptermethode. Ein weiterer Vorteil ist, dass die Methoden im angepassten Objekt nicht freigelegt werden. Da das Klassenadapter das angepasste Objekt erbt, sind die Funktionen der angepassten Objektklasse auch in der Adapterklasse enthalten, wodurch die Adapter-Klasse einige seltsame Schnittstellen aufweist, was für Benutzer kostengünstiger ist. Daher ist der Objektadaptermodus flexibler und praktischer.
Public Class Client {public static void main (String [] args) {// chinavoltage vol = new chinavoltage (); // system.out.println ("Die Festlandspannung ist:" + vol.getVoltage ()); // // Die Spannung mit dem Telefon. Ladegerät: " + charakter.getVoltage ()); // adaptiertes Telefonvoltage Telefonv = new PhoneVoltage (); Chargerr Charger = New Chargerr (Telefonv); System.out.println ("Spannung durch das Ladegerät umgewandelt:" + Charger.getVoltage ()); } // Betriebsergebnis: // Spannung über das Ladegerät umgewandelt: 5} Zusammenfassen:
Die klassische Implementierung des Adaptermodells besteht darin, ursprünglich inkompatible Schnittstellen so zu integrieren, dass sie gut kooperieren können. In der tatsächlichen Entwicklung verfügt das Adaptermodell jedoch auch über einige flexible Implementierungen. Die Isolationsänderungen in ListView machen beispielsweise die gesamte UI -Architektur flexibler und können Änderungen annehmen. Das Adaptermodell wird in der Entwicklung häufig verwendet.
Vorteil:
Bessere Wiederverwendbarkeit: Das System muss vorhandene Klassen verwenden, und solche Schnittstellen entsprechen den Anforderungen des Systems nicht. Dann können diese Funktionen im Adaptermodus besser wiederverwendet werden.
Bessere Skalierbarkeit: Wenn Sie die Adapterfunktion implementieren, können Sie die von Ihnen entwickelten Funktionen aufrufen, um die Funktionen des Systems auf natürliche Weise zu erweitern.
Mangel:
Zu viel Einsatz von Adaptern macht das System sehr chaotisch und schwer zu erfassen. Zum Beispiel ist die Chang -A -Schnittstelle, die aufgerufen wird, tatsächlich an die Implementierung der B -Schnittstelle angepasst. Wenn es in einem System zu viele Fälle davon gibt, ist es gleichbedeutend mit einer Katastrophe. Wenn dies nicht erforderlich ist, kann der Adapter verwendet werden, anstatt das System direkt neu zu verarbeiten.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.