Heim >Java >javaLernprogramm >Gängige Entwurfsmuster in JAVA
Dieser Artikel teilt Ihnen hauptsächlich die gängigen Designmuster von JAVA mit. Freunde, die es brauchen, können einen Blick darauf werfen.
Ich war schon sehr früh mit Designmustern konfrontiert. Als ich heute einige Artikel las, stellte ich fest, dass ich einige Abweichungen beim Lernen und Verstehen von Designmustern hatte. Entwurfsmuster sollten bestimmte Szenarien bedienen und sind Code-Lösungsideen, die aus früheren Erfahrungen zusammengefasst werden. Bei dieser Lösungsidee geht es darum, die Kopplung zwischen Codes zu verringern und die Redundanz zu verringern. Der Zweck eines niedrigeren Grades besteht in einer besseren Erweiterung des Programms. Unter der sogenannten besseren Erweiterung versteht man, dass bei einer Änderung oder Erweiterung der Funktion möglichst wenig Änderungen ausgelöst werden. Daher sollte beim Erlernen von Entwurfsmustern eine gute Lernmethode darin bestehen, die Erweiterung des Programms zu simulieren, um die Unterschiede zwischen den von Vorgängern zusammengefassten Entwurfsmustern und dem vorhandenen Code zu vergleichen. Nur wenn wir seine Vorteile wirklich erkennen, können wir sein Wesen vollständig verstehen. .
Kreative Muster
Kreative Muster abstrahieren den Instanziierungsprozess von Objekten, was einem System hilft, unabhängig davon zu sein, wie diese Objekte erstellt, zusammengesetzt und dargestellt werden.
Abstract Factory Pattern
Abstract Factory Pattern wird verwendet, um Fabriken mit unterschiedlichen Produktfamilien zu erstellen Die Werte verschiedener Objekte beziehen sich auf Objekte, die dieselbe Schnittstelle implementieren. Daher implementieren Objekte derselben Produktfamilie definitiv nicht dieselbe Schnittstelle.
Das abstrakte Fabrikmuster umfasst 7 Hauptrollen, eine abstrakte Rolle der Klasse A und eine konkrete Rolle der Klasse A (AbstractProductA, ProductA), eine abstrakte Rolle der Klasse B und eine konkrete Rolle der Klasse B (AbstractProductB, ProductB), eine abstrakte Fabrik (AbstractFactory). Stellt zwei Methodenschnittstellen für Produkte vom Typ A und Produkte vom Typ B bereit. Die konkrete Fabrik (ConcreteFactory) implementiert die beiden Methodenschnittstellen der abstrakten Fabrik. Die Implementierung der beiden Methodenschnittstellen hängt von den verschiedenen Produkten A und B ab (createProductA wird von der Implementierung abgeleitet). Klasse von Produkt A Wählen Sie eine Implementierungsklasse aus der Implementierungsklasse aus. createProductB wählt eine Implementierungsklasse aus der Implementierungsklasse von Produkt B aus. Der Kunde verlässt sich auf die spezifische Implementierungsklasse der abstrakten Fabrik, um Produktfamilienprodukte einer bestimmten Fabrik zu produzieren.
Das abstrakte Fabrikmuster implementiert die Bereitstellung von Produktfamilienfabriken für mehrere Produkte und realisiert mehrdimensionale Kombinationen mehrerer Produkte. Ein typisches Beispiel für Produktfamilien ist UnixButton und WindowsButton. Ab Werk für verschiedene Produktkombinationen erhältlich. Unter dem Gesichtspunkt der Erweiterung implementiert die konkrete Fabrik die abstrakte Fabrik. Wenn eine neue Produktfamilie benötigt wird, implementieren Sie einfach eine andere Produktfamilie und realisieren Sie Hot-Swapping. Beim Vergleich des Fabrikmodells steht eine konkrete Fabrik einem Produkt gegenüber, während eine abstrakte Fabrik einer Reihe von Produkten gegenübersteht.
Builder-Muster
Die Rolle des Builder-Musters besteht darin, die Konstruktionsschritte eines Objekts zu abstrahieren und so das Umschreiben zu erleichtern ein Objekt Objektkonstruktionsprozess.
Das Builder-Muster umfasst 4 Hauptrollen: Builder-Schnittstelle (Builder), konkreter Builder (ConcreteBuilder), Produktobjekt (Product) und Director-Klasse (Director). Die Konstruktmethode der Director-Klasse ist für den Aufruf mehrerer BuildPart-Methoden des abstrakten Builders für den Zusammenbau verantwortlich. Die Builder-Schnittstelle definiert mehrere Teilkonstruktionsprozesse, die Methode buildPart() und die Konstruktionsergebnismethode RetrieverResult() für konkrete Builder Zur Implementierung implementiert ConcreteBuilder Teilkonstruktionsmethoden und die Ergebnisrückgabemethode. Der jeweilige Builder führt die entsprechende Montageaufgabe aus und verwendet RetrieverResult, um das entsprechende Montageergebnis zu erhalten.
Aus Zwecksicht realisiert das Builder-Muster die einfachste Implementierung verschiedener Montagemethoden von Objekten. Die Reihenfolge der Montage wird von der Director-Klasse gesteuert, und die spezifischen Assembly-Aufgaben werden in den Händen verschiedener Builder verteilt und abstrakt Die Aggregationsbeziehung von Buildern macht den tatsächlichen Betrieb der Produktkonstruktion im laufenden Betrieb austauschbar, wodurch die spezifische Implementierung des Builds einfacher erweitert oder ersetzt werden kann. Wenn Sie andererseits die Director-Klasse verwenden, um das Produkt direkt zu bedienen, um den Produktmontageprozess zu implementieren, und Sie den Konstruktionsprozess ändern müssen, müssen Sie die Director-Klasse ändern, was wir nicht sehen möchten .
Strukturmuster
Strukturmuster konzentriert sich darauf, wie bestehende Klassen zusammengestellt und die Interaktionen zwischen ihnen gestaltet werden, um bestimmte Ziele zu erreichen, wie z. B. Skalierbarkeit und Kapselung.
Adaptermuster
Der Zweck des Adaptermusters besteht darin, die Methodenschnittstelle einer Klasse in eine andere Methodenschnittstelle umzuwandeln, die von einem anderen Client verwendet wird.
Das Adaptermuster enthält drei Hauptrollen: die vom Client benötigte Zielschnittstelle (Target) und ihre Methode „sampleOperation(); Zielschnittstelle und erbt Adaptee. Die SampleOperation-Methode des Adapters ruft die SampleOperation-Methode von Adptee auf. Tatsächlich kann die Adaptee-Klassenmethode durch Vererbung oder direkte Abhängigkeit aufgerufen werden. Ersteres wird als Klassenadapter und letzteres als Objektadapter bezeichnet.
Das Adaptermuster implementiert die Kompatibilitätskonvertierung von einer Schnittstelle zur anderen. Es gibt nichts Besonderes an der Skalierbarkeit.
Decorator-Muster
Das Decorator-Muster wird auch Verpackungsmuster genannt. Sein Zweck besteht darin, die Funktionalität einer Klasse dynamisch zu erweitern, ohne die ursprüngliche Vererbungsbeziehung zu ändern. Die Funktionen der hier genannten erweiterten Klassen können Änderungen an vorhandenen Methoden sein oder weitere Methoden bereitstellen.
Das Dekoratormuster enthält 4 Hauptrollen, die bereits im System vorhandene Vererbungsbeziehung, die Komponentenschnittstelle (Component) und ihre Implementierungsklasse (ConcreteComponent), und der Dekorator (Decorator) implementiert die Komponentenschnittstelle und hängt davon ab Abhängig von der zu dekorierenden konkreten Implementierungsklasse hängt ihre Methode „sampleOperation()“ von der Methode „sampleOperation()“ der jeweiligen zu dekorierenden Komponentenklasse ab, und dann erbt der spezifische Dekorator (ConcreateDecorator) von Decorator, der andere Methoden hinzufügen oder die entsprechenden ändern kann Mit der Methode „sampleOperation“ wird eine andere Methode erreicht. Ändern Sie die ursprüngliche Klasse und implementieren Sie dieselbe dynamische Methodenerweiterung. Diese Erweiterung ist für den Client transparent.
Aus Sicht der Erweiterung ersetzt Decorator die ursprüngliche ConCreteComponent und vervollständigt die dynamische Erweiterung der Vererbung. Diese Methode weist geringere Abhängigkeiten von den Objekten auf, die sie dekoriert ein- und ausgeschaltet, und ConcreteComponent muss die Existenz dekorativer Klassen nicht kennen, sodass keine komplexen Klassenbeziehungen gepflegt werden müssen.
Ein konkretes Anwendungsbeispiel ist die Beziehung zwischen BufferInputStream und FileInputStream. FileInputStream, ByteArrayInputStream usw. sind spezifische Komponenten, die von FilterInputStream erben .
Proxy-Muster
Der Zweck des Proxy-Musters besteht darin, einen Proxy für ein Objekt bereitzustellen, das verbessert und geändert werden kann oder sogar die ursprünglichen Funktionen löschen.
Da der Proxy-Modus sehr weit verbreitet ist, wurde er in einem anderen Blog ausführlich beschrieben und wird hier nicht überflüssig.
Strukturmuster
Strukturelles Entwurfsmuster konzentriert sich auf die Verteilung von Verantwortlichkeiten zwischen Klassen oder Objekten und untersucht, wie mehrere Klassen oder Objekte effizient zusammenarbeiten können, um eine Aufgabe zu erledigen.
Beobachtermuster
Der Zweck des Beobachtermusters besteht darin, eine Eins-zu-viele-Abhängigkeitsbeziehung zu implementieren, sodass bei einer Aktualisierung des Themas die Aktualisierung in a benachrichtigt werden kann spezifischer Weg. Themengebundener Beobachter.
Das Beobachtermuster enthält 4 Teilnehmer, eine Themenschnittstelle und ein spezifisches Implementierungsthema (Subject, ConcreteSubject), einen Beobachter und einen konkreten Beobachter (Observer, ConcreateObserver). Beobachter werden durch Aggregation im Subjekt registriert. Aufgrund der Abhängigkeitsdefinitionsschnittstelle können bestimmte Themen unterschiedliche Benachrichtigungsstrategien implementieren und Abhängigkeiten mit geringer Kopplung zwischen bestimmten Beobachtern und bestimmten Themen erreichen.
Die Abhängigkeit zwischen den beiden kann über die Attach- und Detach-Methoden hergestellt und freigegeben werden. Wenn das Subjekt seinen Status ändert, kann es alle Beobachter über notifyObserver benachrichtigen und die Update-Methode des entsprechenden Beobachters aufrufen.
Aus Sicht der Erweiterung besteht der Vorteil des Beobachtermusters darin, dass Sie beim Hinzufügen eines neuen Beobachters nur die Beobachterschnittstelle implementieren und diese dann hinzufügen müssen, indem Sie sie auf ähnliche Weise an das spezifische Subjekt anhängen, das Sie überwachen möchten Sie möchten löschen Ein Beobachter in einem Subjekt muss nur die Attach-Methode aufrufen, um Hot-Swapping zu implementieren. Wenn diese Entwurfsmethode nicht übernommen wird, führt die Unfähigkeit einer Partei, die Schnittstelle zu verwenden, zu Schwierigkeiten beim Hinzufügen einer Partei.
Mediator-Muster
Die Rolle des Mediator-Musters besteht darin, ein Zwischenobjekt zu verwenden, um die Interaktion einer Reihe von Objekten zu kapseln, sodass die Interaktion jedes Objekts nicht explizit erforderlich ist Interdependenz. Vereinfacht ausgedrückt geht es darum, die Interaktion zwischen verschiedenen Objekten von einer Viele-zu-Viele-Netzassoziation in eine Eins-zu-Viele-Sternassoziation umzuwandeln.
Das Mediator-Muster besteht aus vier Hauptrollen. Die Mediator-Schnittstelle (Mediator) definiert die öffentliche Interaktionsmethode changes(); der konkrete Mediator (ConcreteMediator) implementiert die spezifische Interaktionsmethode changes() und erhält die erforderlichen Persistenz Es gibt einen Verweis auf den Kollegen, der kommuniziert werden muss. Die spezifische Implementierung der Methode changes() hängt von der gehaltenen Kollegen-Referenz (Kollege) ab, die die Zuordnung zwischen der Kollegenschnittstelle und der Vermittlerschnittstelle definiert stellt eine Schnittstellenmethode zum Erhalten des Mediators bereit. Es kann mehrere Kollegen-Implementierungsklassen (ConcreteColleague) geben, die hauptsächlich spezifische interaktive Operationen implementieren. Die interaktiven Operationen hängen von der geänderten Methode des zugehörigen Mediators ab. Was den Grund angeht, warum es sich um eine Eins-zu-Viele-Beziehung handelt, gemessen an der Beziehung zwischen den vier oben genannten Rollen: Jeder Kollege hat einen Verweis auf einen Mediator und jeder Mediator verweist auf alle Colleges.
Der Vorteil des Mediatormusters besteht darin, die Interaktion komplexer Systemobjekte zu entkoppeln, sodass beim Hinzufügen oder Löschen eines Colleges nur der Zwischenmediator geändert werden muss. Der Mediator kann auch durch einen anderen spezifischen Mediator ersetzt werden und das entsprechende interaktive Verhalten ersetzen. Der Nachteil besteht darin, dass mit der zunehmenden Zahl der Kollegen, die interagieren müssen, auch die Zahl der spezifischen Vermittler weiter zunehmen wird.
Das obige ist der detaillierte Inhalt vonGängige Entwurfsmuster in JAVA. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!