Entwurfsmuster
Wenn man die Prinzipien und Methoden des objekt-orientierten Entwurfs sicher
beherscht, stellt man fest, dass einige Entwurfsmuster immer wieder auftauchen.
Es bietet sich also die Chance, auch in der der Entwurfsphase bewährte
Problemlösungen wiederzuverwenden. Es entstehen derzeit Kataloge für
Entwurfsmuster, vergleichbar mit den "Musterbüchern" anderer
Ingenieurdisziplinen, in denen diese Lösungen aufgezählt und
beschrieben sind. So finden sich z.B. in Gamma/Helm/Johnson/Vlissides
(S. 9 ff) die untenstehenden 24 Entwurfsmuster, die - ihrer Aufgabe entsprechend
- einem der Bereiche Erzeugung, Struktur und Verhalten
zugeordnet sind. Jedes dieser Entwurfsmuster wird dort
ausführlich nach folgender Struktur beschrieben: Zweck, Synonyme,
Motivation, Anwendbarkeit, Struktur, Teilnehmer, Interaktionen, Konsequenzen,
Implementierung, Beispielcode, bekannte Verwendungen, verwandte Muster.
Gängige Entwurfsmuster
Erzeugung
-
Abstrakte Fabrik (Abstract Factory)
-
Biete eine Schnittstelle zum Erzeugen von Familien verwandter oder voneinander
abhängiger Objekte, ohne ihre konkreten Klassen zu benennen.
-
Erbauer (Builder)
-
Trenne die Konstruktion eines komplexen Objektes von seiner Representation,
so daß derselbe Konstruktionsprozess unterschiedliche Repräsentationen
erzeugen kann.
-
Fabrikmethode (Factory method)
-
Definiere eine Klassenschnittstelle mit Operationen zum Erzeugen eines
Objekts, aber lasse Unterklassen entscheiden, von welcher Klasse das zu
erzeugende Objekt ist. Fabrikmethoden ermöglichen es einer Klasse,
die Erzeugung von Objekten an Unterklassen zu delegieren.
-
Prototyp (Prototype)
-
Bestimme die Arten zu erzeugender Objekte durch die Verwendung eines prototypischen
Exemplars, und erzeuge neue Objekte durch Kopieren dieses Prototypen.
-
Singleton
-
Sichere ab, dass eine Klasse nur ein Exemplar besitzt, und stelle einen
globalen Zugriffspunkt darauf bereit.
Struktur
-
Adapter
-
Passe die Schnittstelle einer Klasse an eine andere von ihren Klienten
erwartete Schnittstelle an. Das Adaptermuster lässt Klassen zusammenarbeiten,
die wegen inkompatibler Schnittstellen ansonsten nicht dazu in der Lage
wären.
-
Brücke (Bridge)
-
Entkopple eine Abstraktion von ihrer Implementierung, so dass beide unabhängig
voneinander variiert werden können.
-
Dekorierer (Decorator)
-
Erweitere ein Objekt dynamisch um Zuständigkeiten. Dekorierer bieten
eine flexible Alternative zur Unterklassenbildung, um die Funktionalität
einer Klasse zu erweitern.
-
Fassade (Facade)
-
Biete eine einheitliche Schnittstelle zu einer Menge von Schnittstellen
eines Subsystems. Die Fassadenklasse definiert eine abstrakte Schnittstelle,
welche die Verwendung des Systems vereinfacht.
-
Fliegengewicht (Flyweight)
-
Nutze Objekte kleinster Granularität gemeinsam, um grosse Mengen von
ihnen effizient verwenden zu können.
-
Kompositum (Composite)
-
Füge Objekte zu Baumstrukturen zusammen, um Teil-Ganzes-Hierarchien
zu repräsentieren. Das Kompositionsmuster ermöglicht es Klienten,
einzelne Objekte sowie Kompositionen von Objekten einheitlich zu behandeln.
-
Proxy
-
Kontrolliere den Zugriff auf ein Objekt mit Hilfe eines vorgelagerten Stellvertreterobjekts.
Verhalten
-
Befehl (Command)
-
Kapsle einen Befehl als ein Objekt. Dies ermöglicht es, Klienten mit
verschiedenen Anfragen zu parametrieren, Operationen in eine Queue zu stellen,
ein Logbuch zu führen und Operationen rückgängig zu machen.
-
Beobachter (Observer)
-
Definiere eine 1-zu-n-Abhängigkeit zwischen Objekten, so dass die
Änderung des Zustands eines Objekts dazu führt, dass alle abhängigen
Objekte benachrichtigt und automatisch aktualisiert werden.
-
Besucher (Visitor)
-
Kapsle eine auf den Elementen einer Objektstruktur auszuführende Operation
als ein Objekt. Das Besuchermuster ermöglicht es, eine neue Operation
zu definieren, ohne die Klassen der von ihr bearbeiteten Elemente zu verändern.
-
Interpreter
-
Definiere für eine gegebene Sprache eine Repräsentation der Grammatik
sowie einen Interpreter, der Repräsentation nutzt, um Sätze in
der Sprache zu interpretieren.
-
Iterator (Iterator)
-
Ermögliche den sequentiellen Zugriff auf die Elemente eines zusamengesetzten
Objektes, ohne seine zugrundeliegende Repräsentation offenzulegen.
-
Memento
-
Erfasse und externalisiere den internen Zustand eines Objektes, ohne seine
Kapselung zu verletzen, so dass das Objekt später in diesen Zustand
zurückversetzt werden kann.
-
Schablonenmethode (Template Method)
-
Definiere das Skelett eines Algorithmus in einer Operation und delegiere
einzelne Schritte an Unterklassen. Die Verwendung einer Schablonenmethode
ermöglicht es Unterklassen, bestimmte Schritte eines Algorithmus zu
überschreiben, ohne seine Struktur zu verändern.
-
Strategie (Strategy)
-
Definiere eine Familie von Algorithmen, kapsele jeden einzelnen und mache
sie austauschbar. Das Strategiemuster ermöglicht es, den Algorithmus
unabhängig von ihn nutzenden Klienten zu variieren.
-
Vermittler (Mediator)
-
Definiere ein Objekt, welches das Zusammenspiel einer Menge von Objekten
in sich kapselt. Vermittler fördern lose Kopplung, indem sie Objekte
davon abhalten, aufeinander explizit Bezug zu nehmen. Sie ermöglichen
es ihnen, das Zusammenspiel der Objekte von ihnen unbhängig zu variieren.
-
Zustand (State)
-
Ermöglicht es einem Objekt, sein Verhalten zu ändern, wenn sein
interner Zustand sich ändert. Es wird so aussehen, als ob das Objekt
seine Klasse gewechselt hat.
-
Zuständigkeitskette (Chain of Responsibility)
-
Vermeide die Kopplung des Auslösers einer Anfrage an seinen Empfänger,
indem mehr als ein Objekt die Möglichkeit erhält, die Anfrage
zu erledigen. Verkette die empfangenden Objekte, und leite die Anfrage
an der Kette entlang, bis ein Objekt sie erledigt.