Heute möchte ich über die Gang of Four schreiben. Hierbei handelt es nicht um irgendwelche Hardcore Rapper oder sonstige Typen mit Blings-Blings. Mit der Gang of Four (Abk. GoF / dt. Viererbande) sind John Vlissides, Richard Helm, Erich Gamma und Ralph Johnson gemeint. Diese vier Entwickler veröffentlichten im Jahr 1994 das Buch
“Design Patterns - Elements of Reusable Object-Oriented Software”
Dieses Buch hat sich mittlerweile als Standardwerk für Entwurfsmuster etabliert.
Ein durch die Gang of Four beschriebenes Muster folgt dem folgenden Schema:
- Name und Klassifikation des Musters
- Zweck - Welchem Zweck dient das Muster ?
- Synonyme - Unter welchem Namen ist das Muster noch bekannt ?
- Anwendbarkeit - Wo ist das Muster anwendbar ? Wo sind die Einsatzbereiche ?
- Motivation - (Hinter-)Gründe für den Einsatz des Musters
- Struktur - Beschreibung der allgemeinen Struktur des Musters
- Beteiligte Akteure - Welche Klassen sind am dem Muster beteiligt ?
- Zusammenspiel - Wie interagieren die beteiligten Klassen ?
- Konsequenzen - Welche Vor-/Nachteile gibt es ?
- Implementierung - Tips zur Implementierung sowie Warnung vor Fehlern die leicht passieren können
- Beispielcode - Ein Quellcodefragment mit einer beispielhaften Implementierung des Musters
- Praxiseinsatz - Wird das Muster bereits eingesetzt ? Wo wird das Muster bereits eingesetz ?
- Querverweise - Wie spielt das Muster mit anderen Muster zusammen ?
Die Viererbande klassifiziert die Muster nach zwei Kriterien.
Purpose - Der Zweck
Scope - Der Anwendungsbereich auf den sie wirken.
Nach dem Zweck (Purpose) lassen sich Muster in drei Gruppen aufteilen.
Erzeugungsmuster (Creational Pattern)
Erzeugungsmuster dienen der Erzeugung von Objekten. Durch sie lässt sich z.B. die Anzahl der instanzierten Objekte steuern oder der konkrete Typ des Objekts abhängig von den jeweiligen Bedingungen anpassen.
Strukturmuster (Structual Pattern)
Strukturmuster dienen der Vereinfachung der Struktur zwischen Klassen. Komplexe Beziehungsgeflechte können z.B. über vermittelnde Klassen oder Schnittstellen logisch vereinfacht werden.
und Verhaltensmuster (Behaviroal Pattern)
Verhaltensmuster beschäftigen sich mit dem Verhalten der Klassen. Sie beschäftigen sich mit dem Nachrichtenaustausch der Klassen sowie dem Zusammenspiel.
Der Anwendungsbereich (Scope) lässt sich in zwei Gruppen aufteilen
Klassenmuster
Klassenmuster bauen vorrangig Vererbungsstrukturen auf und beschreiben die Beziehungen zwischen Klassen.
Objektmuster
Objektmuster nutzen vorrangig Aggregationen und Assoziationen zur Beschreibung der Beziehungen der Objekte. Die durch sie beschriebenen Beziehungen sind zur Laufzeit änderbar.
Erzeugungsmuster (Creational Pattern)
Durch Erzeugungsmuster werden die Objekterzeugungsprozesse abstrahiert. Klassenmuster nutzen Vererbung um die Klasse des zu erzeugenden Objekts zu variieren. Objektmuster hingegen delegieren die Objekterzeugung an andere Objekte.
Klassenmuster
- Fabrikmethode (Factory Method, Virtual Constructor)
Objektmuster
- Abstrakte Fabrik (Abstract Factory, Kit)
- Erbauer (Builder)
- Singleton
- Prototyp (Prototype)
Strukturmuster (Structural Pattern)
Durch Strukturmuster werden Klassen und Objekte zu größeren Strukturen zusammengefasst. Klassenmuster fassen dabei Schnittstellen und Implementierungen zusammen, während Objektmuster Objekte in eine Struktur einordnen. Durch Klassenmuster beschriebene Strukturen sind zur Übersetzungszeit festgelegt. Die durch Objektmuster beschriebenen Strukturen sind zur Laufzeit änderbar.
Klassenmuster
- Adapter (Adapter, Wrapper) (Adapter mit Vererbung oder Klassenadapter)
Objektmuster
- Brücke (Bridge, Handle/Body)
- Adapter (Adapter, Wrapper) (Adapter mit Assoziation oder Objektadapter).
- Decorator (Decorator, Wrapper)
- Kompositum (Composite)
- Fassade (Facade)
- Stellvertreter (Proxy, Surrogate)
- Fliegengewicht (Flyweight)
Verhaltensmuster (Behavioral Pattern)
Verhaltensmuster beschreiben die Interaktion zwischen Objekten und komplexe Kontrollflüsse. Klassenmuster teilen die Kontrolle auf verschiedene Klassen auf, Objektmuster nutzen Komposition anstelle von Vererbung.
Klassenmuster
- Interpreter (Interpreter)
- Schablonenmethode (Template Method)
Objektmuster
- Zustand (State, Objects for States)
- Zuständigkeitskette (Chain of Responsibility)
- Beobachter (Observer, Dependents, Publish-Subscribe, Listener)
- Vermittler (Mediator)
- Memento (Memento, Token)
- Kommando (Befehl, Command, Action, Transaction)
- Iterator (Iterator, Cursor)
- Strategie (Strategy, Policy)
- Besucher (Visitor)
- Plugin (Plugin)
Fazit:
Die Nutzung von Entwurfsmustern ist außerordentlich effizient. Durch die Nutzung von vorhandenem Wissen spart man Zeit bei der Entwicklung und kann Fehler vermeiden die andere schon gemacht haben. Die Arbeit des Softwareentwicklers verlagert sich von der Erfindung des Rads hin zur Auswahl des richtigen sowie dessen kreativen Verwendung. Entwurfsmuster bestehen aus dem Wissen wiederkehrender Aufgaben / Problemstellungen sowie den Erfahrungen zur Lösung eben dieser. Mit einem prägnanten Namen versehen verbessern die Kommunikation das sie ein einheitliches Vokabular zur Diskussion von Problem und Lösung darstellen. Ich werde in einigen meiner folgenden Artikel noch explizit auf einige der Muster eingehen.