Zum Hauptinhalt springen

CooLWJ durchsuchen

选择搜索范围,输入关键词后按回车。

Sprache

Welche Entwurfsmuster werden im JDK verwendet?

I, Strukturmuster

1,Adaptermuster

Dient dazu, eine Schnittstelle in eine andere umzuwandeln

java.util.Arrays#asList()

javax.swing.JTable(TableModel)

java.io.InputStreamReader(InputStream)

java.io.OutputStreamWriter(OutputStream)

javax.xml.bind.annotation.adapters.XmlAdapter#marshal()

javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

2,Brückenmuster

Dieses Muster entkoppelt die Abstraktion von der Implementierung ihrer Operationen, sodass sich Abstraktion und Implementierung unabhängig voneinander verändern können

AWT (Es stellt eine Abstraktionsschicht bereit, welche die Fensterunterstützung auf das native Betriebssystem abbildet.)

JDBC

3,Kompositum-Muster

sodass einzelne Objekte und Zusammensetzungen von Objekten aus Sicht des Clients gleichbehandelt werden. Anders gesagt: Eine Methode eines bestimmten Typs akzeptiert zugleich auch ihren eigenen Typ als Parameter

javax.swing.JComponent#add(Component)

java.awt.Container#add(Component)

java.util.Map#putAll(Map)

java.util.List#addAll(Collection)

java.util.Set#addAll(Collection)

4,Dekorierer-Muster

Einem Objekt dynamisch zusätzliche Funktionen hinzuzufügen, ist auch eine Alternative zur Unterklassenbildung. Wie man sieht, wird beim Erstellen einer Instanz eines Typs zugleich ein Objekt desselben Typs übergeben. Dies begegnet einem überall im JDK; Sie werden feststellen, dass es allgegenwärtig ist. Die folgende Liste enthält daher nur einen kleinen Ausschnitt

java.io.BufferedInputStream(InputStream)

java.io.DataInputStream(InputStream)

java.io.BufferedOutputStream(OutputStream)

java.util.zip.ZipOutputStream(OutputStream)

java.util.Collections#checked<list |sortedmap |sortedset |set |map>

5,Fassadenmuster

Eine einfache Schnittstelle für eine Gruppe von Komponenten, Schnittstellen, Abstraktionen oder Subsystemen bereitstellen

java.lang.Class

javax.faces.webapp.FacesServlet

6,Fliegengewicht-Muster

Einen Cache verwenden, um die Zugriffszeit auf zahlreiche kleine Objekte zu verkürzen

java.lang.Integer#valueOf(int)

java.lang.Boolean#valueOf(boolean)

java.lang.Byte#valueOf(byte)

java.lang.Character#valueOf(char)

7,Proxy-Muster

Beim Proxy-Muster wird ein einfaches Objekt als Stellvertreter für ein komplexes Objekt oder ein Objekt verwendet, dessen Erstellung zeitaufwendig ist.

java.lang.reflect.Proxy

RMI


Illustration, die Softwaredesign anhand der Java-Kaffeetasse und einer Montageszene darstellt

Zwei, Erzeugungsmuster

1, Abstrakte-Fabrik-Muster

Das abstrakte Fabrikmuster stellt ein Protokoll bereit, um eine Reihe zusammengehöriger oder unabhängiger Objekte zu erzeugen, ohne deren konkrete Typen anzugeben. Es ermöglicht, die Anwendung von der konkreten Implementierung des verwendeten Frameworks zu entkoppeln. Dies ist im JDK und in vielen Frameworks wie Spring überall anzutreffen. Solche Muster lassen sich auch leicht erkennen: Eine Methode erzeugt ein neues Objekt, gibt aber ein Interface oder eine abstrakte Klasse zurück – dann handelt es sich um das abstrakte Fabrikmuster

java.util.Calendar#getInstance()

java.util.Arrays#asList()

java.util.ResourceBundle#getBundle()

java.sql.DriverManager#getConnection()

java.sql.Connection#createStatement()

java.sql.Statement#executeQuery()

java.text.NumberFormat#getInstance()

javax.xml.transform.TransformerFactory#newInstance()

2, Erbauermuster (Builder)

Definiert eine neue Klasse zur Erstellung von Instanzen einer anderen Klasse, um die Erzeugung komplexer Objekte zu vereinfachen. Das Builder-Muster verwendet üblicherweise auch Methodenverkettung zur Umsetzung

java.lang.StringBuilder#append()

java.lang.StringBuffer#append()

java.sql.PreparedStatement

javax.swing.GroupLayout.Group#addComponent()

3,Fabrikmethode

ist einfach eine Methode, die ein konkretes Objekt zurückgibt

java.lang.Proxy#newProxyInstance()

java.lang.Object#toString()

java.lang.Class#newInstance()

java.lang.reflect.Array#newInstance()

java.lang.reflect.Constructor#newInstance()

java.lang.Boolean#valueOf(String)

java.lang.Class#forName()

4,Prototyp-Muster

Ermöglicht es Instanzen einer Klasse, Kopien ihrer selbst zu erzeugen. Wenn das Erstellen einer Objektinstanz sehr komplex und zeitaufwendig ist, kann dieses Muster verwendet werden. Anstatt eine neue Instanz zu erstellen, können Sie ein Objekt kopieren und direkt verändern

java.lang.Object#clone()

java.lang.Cloneable

5,Singleton-Muster

Dient dazu, sicherzustellen, dass eine Klasse nur eine Instanz besitzt. Joshua Bloch empfiehlt in Effetive Java eine weitere Methode: die Verwendung eines Enums

java.lang.Runtime#getRuntime()

java.awt.Toolkit#getDefaultToolkit()

java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()

java.awt.Desktop#getDesktop()


III,Verhaltensmuster

1,Zuständigkeitsketten-Muster

Die Anfrage wird von einem Objekt an das nächste Objekt in der Kette weitergegeben, bis sie vollständig verarbeitet ist. Dadurch werden die Objekte voneinander entkoppelt

java.util.logging.Logger#log()

javax.servlet.Filter#doFilter()

2,Befehlsmodus

Operationen in einem Objekt kapseln, damit sie gespeichert, übergeben und zurückgegeben werden können

java.lang.Runnable

javax.swing.Action

3,Interpreter-Muster

Dieses Muster definiert üblicherweise die Grammatik einer Sprache und analysiert anschließend Anweisungen, die dieser Grammatik entsprechen

java.util.Pattern

java.text.Normalizer

java.text.Format

4, Iteratormuster

Bietet eine einheitliche Methode, um die Objekte einer Collection der Reihe nach zu durchlaufen, unabhängig von der konkreten Implementierung der zugrunde liegenden Collection

java.util.Iterator

java.util.Enumeration

5,Mediator-Muster

Nachrichten über ein zwischengeschaltetes Objekt verteilen und dadurch direkte Abhängigkeiten zwischen Klassen reduzieren

java.util.Timer

java.util.concurrent.Executor#execute()

java.util.concurrent.ExecutorService#submit()

java.lang.reflect.Method#invoke()

6,Memento-Muster

Erstellt eine Momentaufnahme des Objektzustands, damit das Objekt seinen ursprünglichen Zustand wiederherstellen kann, ohne seinen Inhalt offenzulegen. Das Date-Objekt implementiert das Memento-Muster mithilfe eines internen long-Werts

java.util.Date

java.io.Serializable

7,Nullobjekt-Muster

Dieses Muster ersetzt den Zustand, in dem kein Objekt vorhanden ist, durch ein bedeutungsloses Objekt. Dadurch müssen Sie leere Objekte nicht zusätzlich behandeln

java.util.Collections#emptyList()

java.util.Collections#emptyMap()

java.util.Collections#emptySet()

8,Beobachtermuster

Es ermöglicht einem Objekt, Nachrichten flexibel an interessierte Objekte zu senden

java.util.EventListener

javax.servlet.http.HttpSessionBindingListener

javax.servlet.http.HttpSessionAttributeListener

javax.faces.event.PhaseListener

9,Zustandsmuster

Durch die Änderung des inneren Zustands eines Objekts lässt sich dessen Verhalten zur Laufzeit dynamisch ändern

java.util.Iterator

javax.faces.lifecycle.LifeCycle#execute()

10,Strategiemuster

Mit diesem Muster lässt sich eine Gruppe von Algorithmen als eine Reihe von Objekten kapseln. Durch die Übergabe dieser Objekte kann die Funktionalität des Programms flexibel verändert werden

java.util.Comparator#compare()

javax.servlet.http.HttpServlet

javax.servlet.Filter#doFilter()

11, Schablonenmethodenmuster

Ermöglicht Unterklassen, einen Teil einer Methode zu überschreiben, statt sie vollständig neu zu implementieren. Du kannst steuern, welche Operationen die Unterklassen überschreiben müssen

java.util.Collections#sort()

java.io.InputStream#skip()

java.io.InputStream#read()

java.util.AbstractList#indexOf()

12,Besuchermuster

Bietet eine bequeme und wartbare Möglichkeit, eine Gruppe von Objekten zu bearbeiten. Damit lässt sich das Verhalten von Objekten ändern oder erweitern, ohne die bearbeiteten Objekte zu verändern

javax.lang.model.element.Element und javax.lang.model.element.ElementVisitor

javax.lang.model.type.TypeMirror und javax.lang.model.type.TypeVisitor

Anmerkung des Übersetzers: Vieles dürfte umstritten sein. Ob es sich tatsächlich um ein bestimmtes Entwurfsmuster handelt, ist nicht besonders wichtig. Entscheidend ist, dass uns diese Entwürfe Erfahrungen vermitteln können, mit denen wir unseren Code verbessern.


Kommentare

Wird gesendet

Design auswählen

Das Design gilt für die gesamte Website.