Mindmap-Galerie Designmuster
Dies ist eine Mind Map über Designmuster. Der Hauptinhalt umfasst: Adaptermodus, Delegationsmodus, Richtlinienmodus, Vorlagenmodus, Prototypenmodus (Erstellungsmodus), Entwurfsmodusklassifizierung, Agentenmodus einen Agenten für andere Objekte, um den Zugriff auf dieses Objekt, den Singleton -Modus, den Werksmodus und die Entwurfsprinzipien zu steuern.
Bearbeitet um 2025-02-23 19:08:11Diese Vorlage zeigt die Struktur und Funktion des Fortpflanzungssystems in Form einer Mind Map. Es führt die verschiedenen Komponenten der internen und externen Genitalien ein und sortiert das Wissen eindeutig aus, um Ihnen dabei zu helfen, mit den wichtigsten Wissenspunkten vertraut zu werden.
Dies ist eine Mind Map über die Interpretation und Zusammenfassung des Beziehungsfeldes E-Book, des Hauptinhalts: Überblick über die Essenzinterpretation und Übersicht über das Feld E-Book. "Relationship Field" bezieht sich auf das komplexe zwischenmenschliche Netzwerk, in dem ein Individuum andere durch spezifische Verhaltensweisen und Einstellungen beeinflusst.
Dies ist eine Mind Map über Buchhaltungsbücher und Buchhaltungsunterlagen.
Diese Vorlage zeigt die Struktur und Funktion des Fortpflanzungssystems in Form einer Mind Map. Es führt die verschiedenen Komponenten der internen und externen Genitalien ein und sortiert das Wissen eindeutig aus, um Ihnen dabei zu helfen, mit den wichtigsten Wissenspunkten vertraut zu werden.
Dies ist eine Mind Map über die Interpretation und Zusammenfassung des Beziehungsfeldes E-Book, des Hauptinhalts: Überblick über die Essenzinterpretation und Übersicht über das Feld E-Book. "Relationship Field" bezieht sich auf das komplexe zwischenmenschliche Netzwerk, in dem ein Individuum andere durch spezifische Verhaltensweisen und Einstellungen beeinflusst.
Dies ist eine Mind Map über Buchhaltungsbücher und Buchhaltungsunterlagen.
Designmuster
Designprinzipien
SOLIDE
Einzelverantwortung
Eine Klasse sollte nur einen Grund zur Änderung haben, ansonsten sollte die Klasse geteilt werden
Eröffnungs- und Schließprinzip
Offen für Erweiterungen, nahe an Modifikationen
Lischersatzprinzip
Unterklassen können die Funktionen der übergeordneten Klasse erweitern, können jedoch die ursprünglichen Funktionen der übergeordneten Klasse nicht ändern.
Schnittstellen -Isolationsprinzip
Die Schnittstellenaufteilung ist kleiner und dedizierter
Reliance Inversion Prinzip
Bei der Gestaltung von Codestrukturen sollten sich hochrangige Module nicht auf niedrig verlassen Ebenenmodule, beide sollten auf Abstraktion beruhen, die Abstraktion sollte nicht auf Details beruhen, Details sollten sollten Die Abhängigkeit ist abstrakt.
Kussprinzipien
Halte es einfach und dumm
Yagni -Prinzipien
Nicht überdauert
Trockenprinzip
Schreiben Sie keinen doppelten Code
Dimits Gesetz
Das Kernthema ist, dass ein Objekt das geringste Verständnis anderer Objekte beibehalten sollte.
Entwurfsmusterklassifizierung
Schöpfungstyp: 5 Arten von Objekterstellungsprozess
Fabrikmethodenmodus
Abstraktes Fabrikmuster
Singleton -Modus
Builder -Modus
Prototypmodus
Strukturart: Verarbeitungsklassen oder Kombinationen von Objekten, 7 Typen
Adaptermodus
Dekoratormodus
Agentenmodus
Aussehensmodus
Brückenmodus
Kombinationsmodus
Genießen Sie den Yuan -Modus
Verhaltenstyp: Beschreibt, wie Klassen oder Objekte interagieren und wie Verantwortlichkeiten zuweisen, 11 Typen
Richtlinienmodus
Template -Methodenmuster
Beobachtermodus
Iteratormodus
Verantwortungskettenmodell
Befehlsmodus
Memo -Modus
Statusmodus
Besuchermodus
Vermittlungsmodell
Interpreter -Modus
Fabrikmodell
Einfacher Werksmodus
Fabrikmethodenmodus
Abstraktes Fabrikmuster
Singleton -Modus
Hungriger Stil: Erstellen Sie Objektinitialisierung beim Laden
Fauler Stil: Erstellen Sie eine Objektinstanz beim Aufrufen
Statische innere Klasse: Objektinstanzen in der inneren Klasse erstellen
Aufzählte Singletons: Thread-Safe, nur einmal geladen, aufgezählte Klassen sind alle Singleton-Klassen. Das einzige Singleton -Muster, das jetzt nicht zerstört wird (löst Reflexions- und Serialisierungsaufschlüsselung schlecht)
Reflection zerstört Singleton: Obwohl der Konstruktor auf privat eingestellt ist, kann er durch Einstellung von Kraft zugegriffen werden Um seinen Konstruktor zu nennen, löste Lösung: Wirst eine Ausnahme in den privaten Konstruktor und verbieten Sie die Reflexionserstellung.
Die Serialisierung zerstört Singleton: Das Deserialisierte Objekt wird das Gedächtnis neu aufweisen, dh erneut erstellen.
Einzelfall im Containerstil
Der Proxy -Modus bietet einen Proxy für andere Objekte, um den Zugriff auf dieses Objekt zu steuern.
Statische Proxyanalyse:
Fügen Sie zusätzliche Funktionen hinzu, ohne die ursprüngliche Dienstklasse zu ändern
Mangel: 1. Die Anzahl der Klassen muss erhöht werden 2. nicht flexibel genug 3.. Hohe Wartungskosten
Dynamische Proxyanalyse
Implementierungsmethode
Dynamischer Proxy basierend auf JDK
Der allgemeine Prozess ist:
1. Erstellen Sie ein JDK -Dynamik -Proxy -Objekt und geben Sie das Objekt von emberserviceImpl als Zielparameter über.
2. Rufen Sie dann die GetProxy -Methode auf, die Proxy.NewProxyInstance aufruft, um das Proxy -Objekt dieses MitgliedsserviceImpl zu laden.
3. Rufen Sie die Anmeldemethode über das generierte Proxy -Objekt auf, das nicht die Methode von MemberServiceImpl selbst ist, sondern in die Invoke -Methode im IncrocationHandler aufgerufen wird.
4. Entsprechende Verbesserungen können in der Invoke -Methode vorgenommen werden
Quellcode JDK Dynamische Proxyanalyse
NewProxyInstance -Analyse
(Vorverifizierung) Vor dem Erstellen eines Agenten wird zuerst eine grundlegende Überprüfung durchgeführt, wie z. B. leere Parameterüberprüfung und Sicherheitsinspektion.
1. Proxy -Objektgenerierung) hier GetProxyClass0 ist eine sehr wichtige Logik, mit der die Bytecode des Proxy -Objekts erzeugt und das Proxy -Objekt in JVM -Speicher laden wird.
2. GetProxyClass0 -Methode zur Analyse. Wenn es nicht existiert, wird eine Proxy -Klasse generiert und zum Cache hinzugefügt.
3. Gehen Sie dann zur Analyse der Methode Proxyclasscache.get (Loader, Schnittstellen). In diesem Schritt werden hauptsächlich eine grundlegende Überprüfung durchgeführt, und dann müssen Sie den entsprechenden Wert aus der Cache -Karte erhalten, dh den Valuermap -Parameter. Wenn es nicht existiert, müssen wir es initialisieren und in eine leere Concurrenthashmap initialisieren.
3. Dann geht der Code aus. Anschließend müssen Sie die Get () -Methode des Lieferanten verwenden, um den Bytecode zu erstellen, der der Proxy -Klasse entspricht und den Bytecode in JVM -Speicher lädt. Diese Methode ist die Kernlogik hier.
4. Schauen wir uns an, wie die Get () -Methode in diesem Lieferanten aufgerufen wird. Hier springen Sie zur Get () -Methode in der Fabrik. Die Logik dieses Codes besteht hauptsächlich darin, Wert zu erstellen, dh Proxy -Objekte zu erstellen, aber hier wird auch die Sicherheit der Threads benötigt.
5. Schauen Sie sich den Ort an, an dem das Proxy -Objekt tatsächlich ValueFactory (Schlüssel, Parameter) erstellt wird, was durch ValueFactory durchgeführt wird. Zunächst ist diese Logik eine nicht-kernige Logik, die die Gültigkeit des Schnittstellenarrays grob überprüft und sicherstellt, dass die in der generierte Proxy-Klasse implementierte Schnittstelle gültig ist.
6. Die nächste Logik besteht darin, den Paketnamen und den Klassennamen der zu generierenden Proxy -Klasse zu bestimmen. Die Logik lautet: Wenn in der eingehenden Schnittstelle nicht öffentliche Schnittstellen vorhanden sind, befindet sich die generierte Proxy-Klasse in dem Paket, in dem sich diese nicht öffentlichen Schnittstellen befinden. Wenn alle Schnittstellen öffentliche Schnittstellen sind, befindet sich die Proxy -Klasse im Standardpaket com.sun.proxy. Die Standard -Proxy -Klasse wird nicht in das Dateisystem generiert.
7. Der nächste Schritt ist die Kernlogik, die Bytecode generiert und in den Speicher lädt, so dass die Proxy -Klasse in Zukunft über das Klassenobjekt verwendet werden kann. Dies ist der Prozess der Generierung von Proxy -Klassen über JDK Dynamic Proxy. Nach Abschluss der Ausführung ist die Klasse <?> Cl = getProxyClass0 (Loader, INTFS). Diese Logik kann die erstellte Proxy -Klasse zurückgeben.
8. Der nächste Schritt ist der letzte Schritt, der die Proxy -Klasse zu einem Proxy -Objekt erstellt. Dieses Proxy -Objekt implementiert die angegebene Schnittstelle und delegiert den Methodenaufruf an den angegebenen InvocationHandler.
Dynamischer Proxy basierend auf CGLIB.
Der allgemeine Prozess
1. Es gibt eine normale Klasse namens LoginService, die eine Anmeldemethode für die Ausführung von Anmeldeboten enthält.
2. Es gibt eine Klasse namens Cglibdynamicproxy, die die MethodInterceptor -Schnittstelle implementiert. Der Zweck dieser Klasse ist es, ein CGGLIB -Dynamik -Proxy -Objekt zu erstellen, um Methoden anstelle anderer Objekte auszuführen.
3. In dem Konstruktor der CGlibdynamicProxy -Klasse empfängt es ein Zielobjekt, das das Objekt angibt, das Sie proxy möchten.
4. Die GetProxy -Methode wird verwendet, um ein Proxy -Objekt zu erstellen. Es verwendet die CGGLIB -Enhancer -Klasse, nimmt die Klasse des Zielobjekts als Superklasse (übergeordnete Klasse) und legt das aktuelle Objekt als Methoden -Interceptor fest (dies ist das aktuelle Objekt). Anschließend erstellt das Proxy -Objekt mit Enhancer und kehrt zurück.
5. In der Intercept -Methode wird zuerst die Methode des Proxy -Objekts aufgerufen, um den Beginn des CGGLIB -Dynamischen Proxys anzugeben und dann die entsprechende Methode des Zielobjekts aufzurufen. Dann gibt es erneut eine Textzeile aus, um das Ende des CGGLIB -Dynamikproxy anzuzeigen.
6. In der cglibdynamictest -Klasse erstellen wir ein Cglibdynamicproxy -Objekt und übergeben das LoginService -Objekt als Ziel an ihn. Wir verwenden dann die GetProxy -Methode, um das Proxy -Objekt zu erhalten und es in den LoginService -Typ zu verwandeln.
7. Schließlich verwenden wir das Proxy -Objekt, um die Anmeldemethode aufzurufen. Jedes Mal, wenn eine Methode aufgerufen wird, gibt der Proxy den Text vor und nach der Methode aus, um den Beginn und das Ende des CGGLIB -Dynamischen Proxys anzuzeigen.
Der Unterschied zwischen zwei dynamischen Proxy
1. Verschiedene Implementierungsmethoden
JDK Dynamic Proxy implementiert alle Schnittstellen des Proxy -Objekts durch Reflexion, sodass JDK nur Proxy -Objekte, die Schnittstellenobjekte implementieren, profitieren können.
Cgllib schreibt alle Methoden der Proxy -Klasse um, sodass nicht alle Methoden verfolgt werden können (privat und endgültig können nicht verwendet werden).
2. Verschiedene Möglichkeiten, Proxy -Objekte abzufangen
JDK Dynamic Proxy wird durch die Implementierung der InvocationHandler -Schnittstelle implementiert.
CGGLIB Dynamic Proxy verwendet Unterklassen der Zielklasse, überschreibt die Geschäftsmethoden und fügt eine Kreuzkaltungslogik hinzu, um Abfangen zu erreichen.
3. unterschiedliche Leistung und Effizienz
JDK Dynamic Proxy und CGLIB -Proxy erzeugen während der Laufzeit neue Bytecode, aber die CGGLIB -Implementierung ist komplexer und verwendet das ASM -Framework.
JDK Dynamic Proxy querys die Schnittstellen aller Proxy -Objekte durch Reflexionsmechanismen und CGGLIB -Proxy -Aufrufmethoden direkt durch den Fast -Class -Mechanismus. Die Ausführungseffizienz ist, dass CGGLIB höher ist als JDK -Proxy.
Für und Wider
Vorteil
Es kann das Proxy -Objekt vom realen als Zielobjekt trennen, den Grad der Kopplung des Systems reduzieren und ist leicht zu erweitern.
Mangel
Durch Erhöhen der Komplexität des Systems wird ein Proxy -Objekt zwischen dem Client und dem Zielobjekt hinzugefügt, und die Anforderungsgeschwindigkeit verlangsamt sich.
Mangel
Der staatliche Proxy wird nach Reflexion implementiert.
Prototypmodus (Erstellungsmodus)
Kernidee: Basierend auf einem vorhandenen Kopieren Sie ein Objekt aus dem Objekt und reduzieren Sie die direkte Erstellung des Objekts durch das Kopieren. kosten.
Tiefe Kopie
Zwei Möglichkeiten zur Implementierung
Eine ist, das Objekt rekursiv zu kopieren
Der zweite Typ besteht darin, dies durch Objektserialisierung zu tun.
Flache Kopie: Nur Adressen kopieren: Beide Objekte sind von demselben Objekt abhängig
Zusammenfassen:
Die flache Kopie kopiert nur den Basistyp im Objekt und die Speicheradresse des Referenzobjekts und kopiert nicht rekursiv. Referenzobjekte und Referenzobjekte, die Objekte referenzieren
Und Deep Copy bedeutet, ein neues Objekt vollständig zu kopieren. Daher sind tiefe Kopieroperationen effektiver als eine flache Kopie Die Leistung ist noch schlimmer. Gleichzeitig ist der flache Kopiercode etwas einfacher zu schreiben als der Deep Copy -Code.
Wenn das von uns kopierte Objekt unveränderlich ist, wird mein Objekt nur Überprüfen Sie es, fügen Sie es nicht hinzu, löschen und ändern Sie es und verwenden Sie sie einfach eine flache Kopie. Wenn es Ergänzungen, Löschungen und Änderungen von Objekten gibt, ist eine tiefe Kopie erforderlich.
Kurz gesagt, es muss angemessen detailliert sein und hängt von der tatsächlichen Situation des Projekts ab.
Vorlagenmuster
Das Framework zur Definition von Geschäftsverarbeitungsprozessen in der übergeordneten Klasse und zur Durchführung spezifischer Implementierungen in der Unterklasse
Richtlinienmodus
Definieren Sie eine Hauptschnittstelle und dann implementieren viele Klassen diese Schnittstelle
Delegationsmodus
Es ist ein orientiert Die grundlegende Funktion des Entwurfsmusters des Bildes besteht darin, für den Aufruf und die Zuweisung von Aufgaben verantwortlich zu sein. Es ist ein spezieller statischer Proxy, der als Voll rechter Proxy verstanden werden kann (Agent-Modus-Note Konzentrieren Sie sich auf den Prozess, während sich der Delegationsmodus auf die Ergebnisse konzentriert.) Der Delegationsmodus gehört zu Verhaltensmodellen Stil gehört nicht zu den GOF23 -Designmodi.
Adaptermodus
Die Kernidee besteht darin, eine Klasse zu interpretieren Konvertieren Sie es in eine andere Schnittstelle, die Kunden wollen. Kombinieren Sie Schnittstellen oder Klassen, die ansonsten nicht übereinstimmen und unvereinbar sind