1 Inhalt: Entwurfsmuster 7.1 Entwurfsmuster, Frameworks, Klassenbibliotheken 7.2 Fabrikmethode-Muster 7.3 Singleton-Muster 7.4 Kompositum-Muster 7.5 Proxy-Muster 7.6 Fassaden-Muster 7.7 Beobachter-Muster 7.8 Schablonenmethode-Muster 2 7.1 Entwurfsmuster, Frameworks, Klassenbibl. Definition Entwurfsmuster (design pattern) Bewährte generische Lösung für ein immer wiederkehrendes Entwurfsproblem, das in bestimmten Situationen auftritt Beschreibung eines Entwurfsmusters Name des Musters Problembeschreibung Wann ist das Muster anwendbar? Lösungsbeschreibung Abstrakte Lösung Konsequenzen Für Evaluierung von Entwurfsalternativen
3 7.1 Entwurfsmuster, Frameworks, Klassenbibl. Klassifikation der Mustern Erzeugungsmuster (creational patterns) Helfen, ein System unabhängig davon zu machen, wie seine Objekte erzeugt, zusammengesetzt und repräsentiert werden Strukturmuster (structural patterns) Befassen sich mit der Zusammensetzung von Klassen und Objekten zu größeren Strukturen Verhaltensmuster (behavioral patterns) Befassen sich mit der Interaktion zwischen Objekten und Klassen Beschreiben komplexe Kontrollflüsse, die zur Laufzeit schwer nachvollziehbar sind 4 7.1 Entwurfsmuster, Frameworks, Klassenbibl. Weitere Klassifikation der Muster Klassenbasierte Muster Behandeln Beziehungen zwischen Klassen Ausgedrückt durch Vererbungsstrukturen Festgelegt zur Übersetzungszeit Objektbasierte Muster Beschreiben Beziehungen zwischen Objekten, die zur Laufzeit geändert werden können Benutzen auch bis zu einem gewissen Grad die Vererbung
5 7.1 Entwurfsmuster, Frameworks, Klassenbibl. Klassenbibliothek Organisierte Softwaresammlung, aus der ein Entwickler nach Bedarf Einheiten verwendet Topologien Baum-Topologie Gemeinsame Wurzelklasse Wald-Topologie Bibliothek besteht aus mehreren Baumhierarchien Vorteil: Flachere Vererbungshierarchie im Vergleich zur Baum-Topologie Baustein-Topologie Unabhängige Klassen Verwendung des Konzepts der generischen Klasse zur spezifischen Anpassung 6 fundamentale, allgemein nutzbare, systemnahe Klassen wie Listen, strings, 7.1 Entwurfsmuster, Frameworks, Klassenbibl. bags, maps, queues usw. Klassenbibliotheken Fundamental- Klassenbibliotheken GUI- Klassenbibliotheken Grafik- Klassenbibliotheken Klassenbibliotheken zum Zugriff auf Datenbanken Klassen fürgrafische Benutzungsoberflächen, wie widgets, menubar, scrollbar, window, list box, text edit Klassen zur Entwicklung komplexer, interaktiver Grafikanwendungen: Diagramme, spreadsheets, Skalen, Vektorgrafiken Klassen zur Ansteuerung von (relationalen) Datenbanksystemen Klassenbibliotheken zur Interprozeßkommunikation Anwendungsspezifische Klassenbibliotheken Klassen zur Kommunikation zwischen Prozessen: dispatcher, data representation, message header, name-service
7 7.1 Entwurfsmuster, Frameworks, Klassenbibl. Framework Def.: Menge von zusammenarbeitenden Klassen, die einen wiederverwendbaren Entwurf für einen bestimmten Anwendungsbereich implementieren Besteht aus konkreten und? insbesondere? aus abstrakten Klassen, die Schnittstellen definieren Definition von Unterklassen zur Verwendung und Anpassung des Frameworks Selbstdefinierte Unterklassen empfangen Botschaften von vordefinierten Framework- Klassen Hollywood-Prinzip:»Don t call us, we ll call you«. 8 7.1 Entwurfsmuster, Frameworks, Klassenbibl. Frameworks sind immer spezifisch auf einen Anwendungsbereich ausgelegt Beispiele Erstellung grafischer Editoren Erstellung von Finanzsoftware Spezialisierung eines Frameworks für eine konkrete Anwendung durch Ableiten von Unterklassen aus den abstrakten Framework-Klassen Realisierung der Frameworks mittels Programmiersprachen Frameworks können also ausgeführt und direkt wiederverwendet werden Frameworks ermöglichen hohe Wiederverwendung
9 7.1 Entwurfsmuster, Frameworks, Klassenbibl. Frameworks bestimmen die Architektur der Anwendung definieren die Struktur der Klassen und Objekte und deren Verantwortlichkeiten legen fest, wie Klassen und Objekte zusammenarbeiten legen fest, wie der Kontrollfluß aussieht Anwendungsprogrammierer kann sich auf die Details der Anwendung konzentrieren 10 7.1 Entwurfsmuster, Frameworks, Klassenbibl. Muster vs. Framework Entwurfsmuster sind abstrakter als Frameworks Werden nur beispielhaft durch Programmcode repräsentiert Anwendung von Entwurfsmustern mit einer neuer Implementierung verbunden Entwurfsmuster sind kleiner als Frameworks Ein typisches Framework enthält mehrere Entwurfsmuster Entwurfsmuster sind weniger spezialisiert als Frameworks Keine Beschränkung auf einen bestimmten Anwendungsbereich
11 7.2 Fabrikmethode-Muster (factory method) Motivation Verwendung eines Frameworks für eine Anwendung, die mehrere Dokumente gleichzeitig anzeigen kann Verwendung der beiden abstrakten Klassen Application und Document und Modellierung einer Assoziation zwischen ihren Objekten Document open() close() save() revert() docs * Application createdocument() newdocument opendocument() Document *doc = createdocument(); docs.add(doc); doc >open(); MyDocument «creates» MyApplication createdocument() return new MyDocument 12 7.2 Fabrikmethode-Muster Klasse Application ist für die Erzeugung neuer Dokumente zuständig Softwarekonstrukteur leitet von diesen beiden Klassen seine anwendungsspezifischen Klassen ab Problem Erzeugung eines neuen Objekts von MyDocument aus der Klasse MyApplication Framework muß Objekte erzeugen, kennt aber nur die abstrakten Oberklasse, von der es keine Objekte erzeugen darf
13 7.2 Fabrikmethode-Muster Lösung Unterklassen von Application überschreiben die abstrakte Operation createdocument() Exemplar von MyDocument wird zurückgegeben Nach der Erzeugung eines Objekts von MyApplication, kann diese spezifische Dokumente erzeugen, ohne deren exakte Klasse zu kennen Operation createdocument() heißt Fabrikmethode Sie ist für die»fabrikation«eines Objekts verantwortlich 14 7.2 Fabrikmethode-Muster Anwendbarkeit Verwendung des Muster, wenn eine Klasse die von ihr zu erzeugenden Objekte nicht im voraus kennen kann die Unterklassen festlegen sollen, welche Objekte sie erzeugen Struktur (klassenbas. Erzeugungsmuster) Product Creator factorymethod() anoperation() product = factorymethod() ConcreteProduct «creates» ConcreteCreator factorymethod() return new ConcreteProduct
15 7.3 Singleton-Muster Motivation Bei manchen Klassen soll genau ein Objekt existieren Einfacher Zugriff auf dieses Objekt von mehreren anderen Objekten Struktur (Objektbas. Erzeugungsmuster) Singleton uniqueinstance singletondata instance() singletonoperation() getsingletondata() return uniqueinstance 16 7.3 Singleton-Muster Deklaration class Singleton {public:static Singleton* instance(); protected:singleton(); private: static Singleton* uniqueinstance; }; Singleton* Singleton::uniqueInstance = 0; Implementierung Singleton* Singleton::instance() { if (uniqueinstance == 0) { uniqueinstance = new Singleton; } return uniqueinstance; }
17 7.4 Kompositum-Muster (composite) Motivation Zusammensetzen von Grafiken zu komplexen Grafiken Komplexe und einfache Grafikobjekte sollen aus Sicht des Klienten gleich behandelt werden :Text :Line :Pictur e :Pictur e :Rectangle :Rectangle 18 7.4 Kompositum-Muster Lösung mittels Stückliste Graphic draw() add(graphic) remove(graphic) getpart(int) graphics * 0..1 Line Rectangle Text Picture draw() draw() draw() draw() add(g:graphic) remove(graphic) getpart(int) for all g in graphics g.draw() add g to list of graphics
19 7.4 Kompositum-Muster Struktur (Objektbasiertes Strukturmuster) Client 1 Component operation() add(component) remove(component) getpart(int) parts * Leaf Composite 0..1 operation() operation() add(component) remove(component) getpart(int) for all g in parts g.operation() 20 7.5 Proxy-Muster (proxy) Motivation Integration grafischer Objekte in einen Text Darstellung großer Bilder benötigt viel Computerleistung Lösung Verwendung eines Platzhalters Proxy? anstelle des echten Bildes Der Bild-Proxy erzeugt das tatsächliche Bild erst, wenn es benötigt wird :TextDocument image :ImageProxy im Hauptspeicher filename :Image data auf der Festplatte
21 7.5 Proxy-Muster Proxy kontrolliert den Zugriff auf ein Objekt mit Hilfe eines vorgelagerten Stellvertreter-Objekts Text Document * Graphic draw() getextent() store() load() Image imageimp extent draw() getextent() store() load() 1 «creates» image Image Proxy filename extent draw() getextent() store() load() if(image==o) image=loadimage(filename) image >draw() if(image==o) return extent; else return image >getextent(); 22 7.5 Proxy-Muster Anwendung in folgenden Situationen Remote-Proxy als lokaler Vertreter für ein Objekt auf einem anderen Computer Virtuelles Proxy erzeugt»teure«objekte auf Verlangen (wie im Beispiel) Schutz-Proxy kontrolliert Zugriff auf das Original Smart reference als Ersatz für einen einfachen Zeiger, der zusätzlich folgende Funktionen anbietet Zählen der Referenzen auf das eigentliche Objekt Automatische Freigabe, wenn es keine Referenzen mehr besitzt Laden eines persistenten Objekts, wenn es erstmalig referenziert wird Testen eines Objekts auf locking, bevor darauf zugegriffen wird
23 7.5 Proxy-Muster Struktur (Objektbasiertes Strukturmuster) Client 1 Subject request() RealSubject request() 1 real Subject Proxy request() realsubject >request() 24 7.6 Fassaden-Muster (facade) Motivation Entwurfsziel Lose Kopplung von Paketen Lose Kopplung erleichtert den Austausch der Pakete und deren unabhängige Implementierung Fassadenklasse zeigt eine vereinfachte Schnittstelle für die? umfassendere? Funktionalität des Pakets Vereinfachte Sicht genügt vielen Klienten Klienten, denen diese Schnittstelle nicht reicht, müssen hinter die Fassade schauen
25 7.6 Fassaden-Muster Struktur (Objektbasiertes Strukturmuster) Client Client Package Package Facade 26 7.6 Fassaden-Muster Anwenden des Musters, wenn einfache Schnittstellen zu einem komplexen Paket angeboten werden sollen es zahlreiche Abhängigkeiten zwischen Klienten und einem Paket gibt Fassade entkoppelt beide Komponenten Fördert die Unabhängigkeit und Portabilität des Pakets Pakete in Schichten organisiert werden sollen Fassade definiert den Eintritt für jede Schicht Vereinfachung der Pakete, indem ausschließlich über eine Fassade kommuniziert wird
27 7.6 Fassaden-Muster Die Fassaden-Klasse weiß, welche Paket-Klassen für die Bearbeitung einer Botschaft zuständig sind delegiert Botschaften vom Klienten an das zuständige Paket definiert keine neue Funktionalität Die Klassen im Paket führen die von der Fassade zugewiesenen Aufgaben durch wissen nichts von der Fassade 28 7.7 Beobachter-Muster (observer) Motivation Objekt enthält Anwendungsdaten Darstellung dieser Daten auf verschiedene Arten Kreisdiagramm soll sich ändern, wenn die Daten in der Tabelle verändert werden und umgekehrt x y z a b c 60 30 10 50 30 20 80 10 10 a b c a = 50% b = 30% c = 20% Benachrichtigung über Änderung Anfragen, Veränderungen
29 7.7 Beobachter-Muster Struktur Subject kennt alle seine Beobachter (observer) und informiert sie über alle Änderungen Beobachter kennen sich untereinander nicht Synchronisation jeden Beobachters mit dem Zustand des Subject Subject attach(observer) detach(observer) notify() for all o in observers o >update() observers * Observer update() Concrete Subject subjectstate getstate() setstate() subject 1 return subjectstate Concrete Observer observerstate update() observerstate= subject > getstate() 30 7.7 Beobachter-Muster Interaktionen des Beobachter-Musters :Concr etesubject Observer 1 Observer 2 input() setstate() notify() update() getstate() getstate() update()
31 7.8 Schablonenmethode-Muster Motivation Framework, das die Klassen Document und Application bereitstellt Document open() save() close() doread() * docs Application adddocument() opendocument() docreatedocument() canopendocument() abouttoopendocument() MyDocument doread() «creates» MyApplication docreatedocument() canopendocument() abouttoopendocument() 32 7.8 Schablonenmethode-Muster Schablonenmethode opendocument() Definiert den Rahmen eines Algorithmus Delegiert Teilschritte an Unterklassen void Application::openDocument (const char* name) { if (!canopendocument(name) ) return; Document* doc = docreatedocument(); if (doc) { docs->adddocument(doc); abouttoopendocument(doc); doc->open(); doc->doread(); }}
33 7.8 Schablonenmethode-Muster Anwenden des Musters um die invarianten Teile eines Algorithmus genau einmal festzulegen Konkrete Ausführung der variierenden Teile wird den Unterklassen überlassen wenn gemeinsames Verhalten von Unterklassen in einer Oberklasse realisiert werden soll Vermeidung der Duplikation von Code 34 7.8 Schablonenmethode-Muster Struktur (Objektbasiertes Verhaltensmuster) AbstractClass templatemethod() primitiveoperation1() primitiveoperation2() primitiveoperation1() primitiveoperation2() ConcreteClass primitiveoperation1() primitiveoperation2()
35 Aufgabe 1 Modellieren und Erkennen von Mustern Erstellen Sie Klassen- und Sequenzdiagramm Welches Muster liegt vor? ClassSpecification mit AttributeSpecs ClassTree mit AttributeList ClassSymbol mit AttributeSpecs 36 Aufgabe 2 a Systematisches Identifizieren von Entwurfsmustern a. Grafik #Koordinate #istsichtbar +zeigen() +loeschen() +verschieben() zeigen().. loeschen() Kreis #Radius +zeigen() +loeschen() +vergroessern() +verkleinern()
37 Aufgabe 2 b b. Dateiobjekt verschieben() kopieren() loeschen() * Verknuepfung oeffnen() Datei oeffnen() Verzeichnis 0..1 durchsuchen() hinzufuegen() zeigeinhalt() 38 Aufgabe 2 c c. Element Diagram draw() delete() tools * createelement() showelement() activeelement() tool = createelement() Link Object MyDiagram createelement()