Inhalt: Entwurfsmuster 7.1 Entwurfsmuster, Frameworks
Transcription
Inhalt: Entwurfsmuster 7.1 Entwurfsmuster, Frameworks
OM – Entwurfsmuster LE 13 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 OM – Entwurfsmuster LE 13 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 ? OM – Entwurfsmuster LE 13 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 ? OM – Entwurfsmuster LE 13 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 ? OM – Entwurfsmuster LE 13 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 LE 13 6 Fundamentalfundamentale, allgemein OM – Entwurfsmuster Klassenbibliotheken nutzbare, systemnahe Klassen wie Listen, strings, bags, maps, queues usw. 7.1 Entwurfsmuster, Frameworks, Klassenbibl. GUIKlassenbibliotheken Klassen fürgrafische Benutzungsoberflächen, wie widgets, menubar, scrollbar, window, list box, text edit GrafikKlassenbibliotheken Klassen zur Entwicklung komplexer, interaktiver Grafikanwendungen: Diagramme, spreadsheets, Skalen, Vektorgrafiken Klassenbibliotheken zum Zugriff auf Datenbanken Klassen zur Ansteuerung von (relationalen) Datenbanksystemen Klassenbibliotheken Klassenbibliotheken zur Interprozeßkommunikation Anwendungsspezifische Klassenbibliotheken Klassen zur Kommunikation zwischen Prozessen: dispatcher, data representation, m essage header, name-service OM – Entwurfsmuster LE 13 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 FrameworkKlassen ? Hollywood-Prinzip: »Don‘t call us, we‘ll call you«. OM – Entwurfsmuster LE 13 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 OM – Entwurfsmuster LE 13 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 OM – Entwurfsmuster LE 13 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 ? OM – Entwurfsmuster LE 13 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 docs * open() close() save() revert() MyDocument Application createDocument() newDocument openDocument() «creates» Document * doc = createDocument(); docs.add(doc); doc–>open(); MyApplication createDocument() return new MyDocument OM – Entwurfsmuster LE 13 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 OM – Entwurfsmuster LE 13 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 OM – Entwurfsmuster LE 13 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) Creator Product ConcreteProduct factoryMethod() anOperation() ... product = factoryMethod() ... «creates» ConcreteCreator factoryMethod() return new ConcreteProduct OM – Entwurfsmuster LE 13 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 OM – Entwurfsmuster LE 13 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; } OM – Entwurfsmuster LE 13 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 :Pictur e :Text :Line :Pictur e :Rectangle :Rectangle OM – Entwurfsmuster LE 13 18 7.4 Kompositum-Muster ? Lösung mittels Stückliste Graphic draw() add(Gr aphic) remove(Graphic) getPart(int) Line draw() Rectangle draw() Text draw() graphics * 0..1 Picture draw() add( g:Graphic) remove(Graphic) getPart(int) for all g in graphics g.draw() add g to l ist of graphics OM – Entwurfsmuster LE 13 19 7.4 Kompositum-Muster ? Struktur (Objektbasiertes Strukturmuster) Client Component 1 operation() add(Component) remove(Component) getPart(int) parts * 0..1 Leaf operation() Composite operation() add(Component) remove(Component) getPart(int) for all g in parts g.operation() OM – Entwurfsmuster LE 13 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 fileName :Image data im Hauptspeicher auf der Festplatte OM – Entwurfsmuster LE 13 21 7.5 Proxy-Muster ? Proxy kontrolliert den Zugriff auf ein Objekt mit Hilfe eines vorgelagerten Stellvertreter-Objekts Graphic Text Document draw() * getExtent() store() load() «creates» Image imageImp extent draw() getExtent() store() load() 1 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(); OM – Entwurfsmuster LE 13 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 OM – Entwurfsmuster LE 13 23 7.5 Proxy-Muster ? Struktur (Objektbasiertes Strukturmuster) Client Subject 1 request() ... RealSubject 1 request() ... real Subject Proxy request() ... ... realSubject–>request() ... OM – Entwurfsmuster LE 13 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 ? OM – Entwurfsmuster LE 13 25 7.6 Fassaden-Muster ? Struktur (Objektbasiertes Strukturmuster) Client Client Package Package Facade OM – Entwurfsmuster LE 13 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 OM – Entwurfsmuster LE 13 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 OM – Entwurfsmuster LE 13 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 a b c x 60 30 10 y 50 30 20 z 80 10 10 b a a = 50% b = 30% c = 20% c Benachrichtigung über Änderung Anfragen, Veränderungen OM – Entwurfsmuster LE 13 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 * Observer Subject observers update() attach(Observer) detach(Observer) notify() for all o in observers o–>update() Concrete Observer Concrete Subject subjectState getState() setState() subject observerState 1 update() observerState= subject–> getState() return subjectState OM – Entwurfsmuster LE 13 30 7.7 Beobachter-Muster ? Interaktionen des Beobachter-Musters :Concr eteSubject Observer 1 Observer 2 input() setState() notify() update() getState() update() getState() OM – Entwurfsmuster LE 13 31 7.8 Schablonenmethode-Muster ? Motivation ? Framework, das die Klassen Document und Application bereitstellt Document * docs open() save() close() doRead() MyDocument doRead() Application addDocument() openDocument() doCreateDocument() canOpenDocument() aboutToOpenDocument() «creates» MyApplication doCreateDocument() canOpenDocument() aboutToOpenDocument() OM – Entwurfsmuster LE 13 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(); }} OM – Entwurfsmuster LE 13 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 OM – Entwurfsmuster LE 13 34 7.8 Schablonenmethode-Muster ? Struktur (Objektbasiertes Verhaltensmuster) AbstractClass templateMethod() primitiveOperation1() primitiveOperation2() ConcreteClass primitiveOperation1() primitiveOperation2() ... primitiveOperation1() ... primitiveOperation2() ... OM – Entwurfsmuster LE 13 35 Aufgabe 1 ? Modellieren und Erkennen von Mustern ? Erstellen Sie Klassen- und Sequenzdiagramm ? Welches Muster liegt vor? ? ClassSpecification mit AttributeSpecs ? ClassTree mit ? ClassSymbol mit AttributeList AttributeSpecs OM – Entwurfsmuster LE 13 36 Aufgabe 2 a ? Systematisches Identifizieren von Entwurfsmustern a. Grafik #Koordinate #istSichtbar +zeigen() +loeschen() +verschi eben() Kreis #Radius +zeigen() +loeschen() +vergroessern() +verkleinern() zeigen() ..... loeschen() OM – Entwurfsmuster LE 13 37 Aufgabe 2 b b. Dateiobjekt verschieben() kopieren() loeschen() Verknuepfung Datei oeffnen() oeffnen() * 0..1 Verzeichnis durchsuchen() hinzufuegen() zeigeInhalt() OM – Entwurfsmuster LE 13 38 Aufgabe 2 c c. Element draw() delete() Link Diagram tools * Object createElement() showElement() activeElement() MyDiagram createElement() ... tool = createElement() ...