Wintersemester 2010/11
Kapitel 5: Entwurf
Prof. Dr. Markus Müller-Olm
Institut für Informatik, WWU Münster
Planung
Definition
Entwurf
Implementierung
Test
5.1 Einführung
5.2 Schichtenarchitekturen
5.4 Entwurfsmuster
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 3
5.4 Entwurfsmuster
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 4
Warum mit Entwurfsmustern beschäftigen?
Mechanismen kennen lernen, um Erweiterbarkeit und Änderbarkeit
eigener Software zu erreichen:
Entwurfmuster zeigen, dass und wie durch geschickte Strukturierung mehr
erreicht werden kann, als nur, dass die Software „irgendwie“ läuft.
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 5
Referenzen zu Entwurfmustern
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 6
Entwurfsmuster
Jedes Muster hat Vor- und Nachteile, z.B.:
Flexibilität ↔ Overhead,
#Objekte,
Welche Änderungen/Erweiterungen werden gut unterstützt?
Muster kombinierbar
Klassenbasiert ↔ objektbasiert
Vererbung ↔ Komposition & Delegation
white box reuse ↔ black box reuse
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 8
Einteilung von Entwurfsmuster
1. Erzeugungsmuster:
z.B. Abstrakte Fabrik, Erbauer, Fabrikmethode, Prototyp, Singleton
2. Strukturmuster:
z.B. Adapter, Brücke, Dekorierer, Fassade, Fliegengewicht,
Kompositum, Stellvertreter
3. Verhaltensmuster:
z.B. Befehl, Beobachter, Besucher, Iterator, Memento, Strategie,
Interpreter, Schablonenmethode, Vermittler, Zustand,
Zuständigkeitskette
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 9
5.4.1 Erzeugungsmuster
Erzeugungsmuster ...
kapseln den Erzeugungsprozess von Objekten
helfen dadurch, Systeme unabhängig von der Art der Erzeugung,
Zusammensetzung und. Repräsentation der Objekte zu machen
Klassenbasierte Erzeugungsmuster...
nutzen Vererbung zur Variation der instantierten Klasse
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 10
5.4.1.1 Abstrakte Fabrik
Abstrakte Fabrik:
objektbasiertes Erzeugungsmuster
Ziel:
Schnittstelle zum Erzeugen von Familien verwandter
Objekte bieten
Objektfamilie soll leicht konsistent austauschbar sein
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 11
Abstrakte Fabrik: Beispielanwendung
Ziel: Klassenbibliothek für Benutzerschnittstellen, die mehrere
Look&Feel-Standards unterstützen,
z.B. Motif, Presentation Manager
PMFenster MotifFenster
Scrollbar
PMScrollbar MotifScrollbar
Abstrakte Fabrik: Beispielanwendung
Problem:
Bei Erzeugung von Graphikobjekten (new-Kommandos) muss sich
der Klient für den konkreten Standard entscheiden:
z.B. Fenster f = new PMFenster();
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 13
Abstrakte Fabrik: Beispielanwendung
WidgetFabrik
ErzeugeScrollbar() Klient
ErzeugeFenster() Fenster
PMFenster MotifFenster
MotifWidget PMWidget
Fabrik Fabrik
ErzeugeScrollbar() Erzeuge Scrollbar() Scrollbar
ErzeugeFenster() ErzeugeFenster()
PMScrollbar MotifScrollbar
ProduktA2 ProduktA1
KonkreteFabrik1 KonkreteFabrik2
ErzeugeProduktA() ErzeugeProduktA()
ErzeugeProduktB() ErzeugeProduktB()
AbstraktesProd.B
ProduktB2 ProduktB1
Erinnerung: Wird der Klassenname kursiv geschrieben, so ist die Klasse eine
abstrakte Klasse (im Sinne von UML).
In einer Java-Implementierung wäre sie also typischerweise eine abstrakte
Klasse oder ein Interface.
Abstrakte Fabrik: Bemerkungen
Anwendbarkeit (u.a.):
System soll mit Produktfamilie konfiguriert werden
Eigenschaften:
Austausch von Produktfamilie durch eine einzige Änderung,
den Austausch der konkreten Fabrik
Klassen der erzeugten Objekte durch Fabrik vom Klienten isoliert
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 16
5.4.1.2 Fabrikmethode (Factory Method)
Klassenbasiertes Erzeugungsmuster
Ziel:
Eine Klasse (z.B. in einem Framework) muss Objekte erzeugen,
deren Klasse sie nicht kennt
Lösungsidee:
Klassenschnittstelle mit Operationen zum Erzeugen eines Objekts
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 17
Fabrikmethode: Beispielanwendung
Framework für Anwendungen, die mehrere Dokumente gleichzeitig
präsentieren/bearbeiten können
Verschiedene Anwendungen präsentieren verschiedene Arten von
Dokumenten (z.B. Texte, Bilder, MP3-Files etc.)
Erzeuger ...
Produkt Fabrikmethode() produkt =
EineOperation() Fabrikmethode();
...
Bemerkung:
Oft sind Erzeuger und Produkt abstrakte Klassen und Fabrikmethode() ist
eine abstrakte Methode, d.h. in Klasse Erzeuger ist kein Rumpf für die
Fabrikmethode definiert.
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 19
Fabrikmethode: Bemerkungen
Anwendungskontext
Eine Klasse kennt die Klassen der zu erzeugenden Objekte nicht, muss
aber Objekte erzeugen und mit diesen weiterarbeiten
Eigenschaften
Fabrikmethoden werden in Frameworks oft verwendet
Erzeugerklasse und Fabrikmethode können ggf. auch konkret sein
(Default-Implementierung)
Verwendung von Fabrikmethoden führt zu Aufblähung der
Klassenhierarchie
Das hier gezeigte Default-Fabrikmethodenmuster wird durch komplexere
Klassenstrukturen ersetzt, wenn mehr Flexibilität benötigt wird
Verwandte Muster
Die Erzeuge-Methoden der Klasse Abstrakte Fabrik (beim Muster
„Abstrakte Fabrik“) sind Fabrikmethoden.
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 20
Inversion of Control
Hollywood-Prinzip:
„Don‘t call us, we‘ll call you“ !
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 21
5.4.1.3 Singleton
Objektbasiertes Erzeugungsmuster
Ziel
Klasse mit genau einem Objekt (vgl. globale Variable)
Erzeugung weiterer Objekte wird abgefangen
Klasse bietet einfachen Zugriff auf Einzelobjekt
Beispielanwendung
Zur Konfiguration des Systems z.B. beim Abstrakte-Fabrik- oder
Erbauer- Muster
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 22
Singleton: Allgemeine Struktur
Singleton Anwendbarkeit
static GibInstanz() wenn genau ein Exemplar einer Klasse
erforderlich ist
SingletonOperation()
Exemplar soll „global“ zugreifbar sein
GibSingletonDaten()
static einzelExemplar
Eigenschaften
singletonDaten
Zugriffskontrolle auf Einzelexemplar
Ggf. Erzeugung des Einzelexemplars erst,
return einzelExemplar
wenn es tatsächlich benötigt wird
Strukturierter Ersatz für globale Variablen:
nur in Ausnahmefällen verwenden !
Bemerkung Strukturierterer Adressraum als bei globalen
Konstruktor von Singleton sollte Methoden:
Sichtbarkeit „private“ haben, z.B. singleton1.a(), singleton1.b()
damit mit new-Operator keine statt a(), b()
Instanzen erzeugt werden
können
5.4.2 Strukturmuster
Strukturmuster:
Klassen und Objekten zu größeren Strukturen komponieren
Klassenbasierte Strukturmuster:
Vererbung zur Komposition von Interfaces oder Klassen nutzen
Objektbasierte Strukturmuster:
Neue Funktionalität durch Objektkomposition realisieren
Größere Flexibilität durch die Möglichkeit, die Kompositon zur
Laufzeit zu verändern
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 24
5.4.2.1 Adapter
Ziel
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 25
Adapter: Beispielanwendung
Linie
Begrenzungsrahmen()
ErzeugeManipulator()
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 26
Adapter: Beispielanwendung (Forts.)
text
Linie Text
Begrenzungsrahmen() Begrenzungsrahmen()
ErzeugeManipulator() ErzeugeManipulator()
Die Adapterklasse Text passt die Klasse TextAnzeige an die Schnittstelle von
GrafischesObjekt an.
Zur Adaption kann weitergehende Transformation der Ergebnisse der adaptierten
Klasse nötig sein, als im gezeigten Beispiel.
Weiteres Anwendungsbeispiel: Anpassung von Datenbankschnittstellen.
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 27
Adapter: Allgemeine Struktur
1. Klassenadapter
Adapter
Operation() Operation2()
2. Objektadapter
Klient Ziel AdaptierteKlasse
Operation() Operation2()
adaptiertesObjekt
Adapter
Operation()
adaptiertesObjekt.Operation2()
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 28
Eigenschaften
1. Klassenadapter
- Adapter kann genau eine Klasse adaptieren, nicht aber ihre Unterklassen
- Adapter kann Teile der adaptierten Klasse modifizieren (überschreiben)
- Mehrfachvererbung oder zumindest mehrfaches Subtyping nötig
(wie in Java durch Interfaces ermöglicht ...)
- Nur ein Objekt zur Laufzeit (als Instanz der Adapter-Klasse)
2. Objektadapter
- Adapter kann mit anzupassender Klasse und allen ihren Unterklassen
zusammenarbeiten
- kein Überschreiben von Teilen der adaptierten Klasse
- Komposition & Delegation statt Vererbung
- zwei Objekte zur Laufzeit (Instanzen von Adapter und AdaptierterKlasse)
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 29
Adaptermuster: Bemerkungen
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 30
5.4.2.2 Dekorierer (Decorator)
Objektbasiertes Strukturmuster
Ziel
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 31
Dekorierer: Beispielanwendung
Eine graphische Textanzeige-Komponente soll mit Scrollbalken und
Umrahmungen versehen werden
VisuelleKomponente
Zeichne()
TextAnzeige Fenster
Zeichne() Zeichne()
ScrollTextAnzeige RahmenTextAnzeige
Zeichne() Zeichne()
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 32
Probleme der naiven Lösung
Wie erhält man eine Textanzeige, die sowohl scrollen kann als auch
einen Rahmen hat? Weitere Subklasse?
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 33
Dekorierer: Beispielanwendung
Ziel: grafisches Element auf Anforderung des Objektdiagramm:
Klienten umrahmen und/oder mit Scrollbalken Situation zur Laufzeit
versehen
VisuelleKomponente
Zeichne()
komponente
TextAnzeige Dekorierer
Zeichne() Zeichne() komponente.Zeichne()
ScrollDekorierer RahmenDekodierer
Zeichne() Zeichne()
ScrolleBis() ZeichneRahmen()
scrollPosition rahmenBreite
super.Zeichne();
ZeichneRahmen();
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 35
Dekorierer: Allgemeine Struktur
Komponente Anwendbarkeit
Operation()
komponente
Objekte dynamisch
KonkreteKomponente Dekorierer (d.h. (auch) zur Laufzeit) und
Operation() Operation()
transparent um Funktionalität erweitern
komponente.Operation()
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 36
Eigenschaften
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 37
5.4.2.3 Fassade (Facade)
Objektbasiertes Strukturmuster
Ziel:
Zusammenfassen der wichtigsten Schnittstellen eines Subsystems
zu einheitlicher Schnittstelle
Fassade bietet oft (auch) typische Kombinationen von
Subsystemoperationen als eigene Operation
→ vereinfachte Schnittstelle
Hierdurch einfachere Handhabung des Subsystems
Weniger Abhängigkeiten zwischen Subsystemen, insbesondere
wenn Zugriff ausschließlich über Fassade (→ Schichtenarchitektur)
Im Ausnahmefall und bei Bedarf kann auch Durchgriff auf
Einzelschnittstellen erlaubt bleiben; oft schlecht, da dann wieder
starke Abhängigkeit der Subsysteme
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 38
Fassade: Allgemeine Struktur
Klienten
Fassade
Sub−
System
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 39
Fassade: Beispielanwendung
Übersetzer-Subsystem enthält Klassen Scanner, Parser,
Codegenerator usw. mit eigenen Schnittstellen
Fassade kombiniert diese und bietet Operation uebersetze()
Uebersetzer
uebersetze()
Stream
Scanner Token
RISC−CodeGenerator Anweisungsknoten
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 40
Anwendbarkeit
Eigenschaften
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 41
Adapter vs. Fassade
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 42
5.4.2.4 Kompositum (Composite)
Objektbasiertes Strukturmuster
Ziel:
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 43
Kompositum: Beispielanwendungen
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 44
Beispiel:
Repräsentation arithmetischer Ausdrücke
Beispielausdruck: (x * 3) + (y – 2) Objektdiagramm
+ :Addition
* − :Multiplikation :Subtraktion
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 45
Beispiel:
Repräsentation arithmetischer Ausdrücke
Beispielausdruck: (x * 3) + (y – 2) Klassendiagramm
ArithmetischerAusdruck
2
+
eval()
e1,e2
* −
Konstante Variable Addition
x 3 y 2 wert name
eval()
eval() wert
GibTeilausdruck1()
eval()
GibTeilausdruck2()
return e1.eval()+e2.eval();
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 46
Kompositum: Allgemeine Struktur
Klient Komponente
*
Operation()
FuegeHinzu(Komponente)
Entferne(Komponente)
GibKindObjekt(int)
oft konkretere Multiplizität bei
konkreten Kompositum−Klassen
z.B. 2 bei Additionsausdrücken
Blatt Kompositum
Operation() Operation()
FuegeHinzu(Komponente)
Entferne(Komponente)
GibKindObjekt(int)
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 47
Kompositum:Bemerkungen
Anwendbarkeit:
Repräsentation rekursiver Objektstrukturen
Eigenschaften:
Klientencode ist unabhängig von Art des vorliegenden Kompositums
(elementar oder zusammengesetzt)
Neue Kompositions- und Blattklassen sind leicht ergänzbar
Objektbasiertes Strukturmuster
Ziel:
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 49
Stellvertreter: Beispielanwendung
Ein grafischer Editor soll Bilder erst bei Bedarf von der Festplatte laden
Objektdiagramm:
(Situation zur Laufzeit)
einTextDokument
bild
einBildProxy einBild
dateiname daten
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 50
Stellvertreter: Beispielanwendung (Fortsetzung)
Grafik
Klassendiagramm: DokumentenEditor
Zeichne()
GibAusmasse()
Speichere()
Lade()
Bild BildProxy
bildImp dateiname
ausmasse ausmasse
Zeichne() bild Zeichne()
GibAusmasse() GibAusmasse()
Speichere() Speichere()
Lade() Lade()
Subjekt
Klient
Operation()
...
Original Proxy
original
Operation() Operation()
... ...
...
original.Operation(); ...
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 52
Anwendbarkeit
Remote-Proxy:
zur Kommunikation mit Server-Objekt, z.B. bei CORBA
Proxy-Objekt „lebt“ auf Seite des Clients und leitet Aufrufe an das Objekt
auf dem Server weiter
Schutz-Proxy:
kontrolliert den Zugriff auf das Originalobjekt, z.B. Zugriffsrechte
Smart Reference
ähnelt einer Referenz, führt jedoch Zusatzsoperation aus
z.B. reference-counting, Objekt bei Bedarf aus DB laden, bei Zugriff in
DB sperren, Copy-on-Write (verzögertes Kopieren)
Stellvertreter vs. Dekorierer
Prof. Dr. Markus Müller-Olm, WWU Münster Software Engineering, WS 2010/2011, Kapitel 5: Entwurf 54
Fortsetzung folgt ...