design patterns - philipps-universität marburg€¦ · decorator pattern das pattern kann einem...

21
Design Patterns 3. Juni 2015

Upload: others

Post on 16-Jun-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Design Patterns

3. Juni 2015

Taentzer Softwarequalität 2015 138

Überblick

Was sind Design Patterns? Welche Design Patterns gibt es? Wann sollte man Design Patterns einsetzen?

Taentzer Softwarequalität 2015 139

Was sind Design Patterns? Muster, die sich im Softwareentwurf bewährt haben Gute Design Patterns entstammen direkt der Praxis. Antwort auf wiederkehrende Probleme im SW-Entwurf kein fertiges Stück Code, das direkt in eigenen Code

gesetzt werden kann eher eine Art Schablone für die Lösung eines Problems

Kritik: Design Patterns müssen immer wieder neu implementiert werden.

Literatur: E.Gamma, R. Helm, R. Johnson, J. Vlissides: Design Patterns:

Elements of Reusable Object-Oriented Software(ISBN 0-201-63361-2), http://en.wikipedia.org/wiki/Design_Patterns_(book)

Sinn und Zweck von Design Patterns Zwecke:

Stärkere Modularisierung von Software Integration von unabhängig entwickelten Komponenten Variantenmanagement: Gemeinsamkeiten von Objekten

herauskehren, sodass verschiedene Objekte gleich behandelt werden können

Arten: Erzeugungsmuster: AbstractFactory, Builder, Singleton, etc. Strukturmuster: Adapter, Decorator, Fassade, Composite,

Proxy, etc. Verhaltensmuster: Observer, Visitor, Iterator, Strategy, etc.

Taentzer Softwarequalität 2015 140

Patterns zur Objekterzeugung

Anforderungen: Das Einlesen soll von der eigentlichen Anwendungslogik

getrennt werden. (Warum?) Nutzern einer Komponente sollen keine Implementierungs-

details gezeigt werden. Eine komplexe Objektstruktur soll aus verschiedenen

Formaten einlesbar sein.

Taentzer Softwarequalität 2015 141

Patterns zur Objekterzeugung

Singleton schränkt die Objekterzeugung einer Klasse auf eineInstanz ein.

Prototype erzeugt Objekte durch Klonen einer Vorlage, die anschließend modifiziert werden kann.

Abstract Factory gruppiert zusammengehörige Objekt-Factories und abstrahiert von diesen.

Factory method erzeugt Objekte ohne Spezifikation der erzeugenden Klasse.

Builder konstruiert komplexe Objekte separat von ihrerRepräsentation. Derselbe Konstruktionsprozess kann so auf verschiedene Repräsentationen angewendet werden.

Taentzer Softwarequalität 2015 142

Beispiel: Ausgabe in verschiedenen Formaten

Eine Artikelliste soll im JSON- oder XML-Format ausgegeben werden. Jeder Artikel gehört zu einer Kategorie, hat einen Namen und einen Preis. Es können beliebig viele Kategorien definiert sein.

Taentzer Softwarequalität 2015 143

Beispiel für das Builder Pattern

Processor

process(List<Item> list)

ItemWriter

+ printArticle(Item i)+ printCategory(Item i)+ getResult(): File

JsonWriter XmlWriter

for (item: list) {switch item.typecase ARTICLE:

writer.printArticle(item);case CATEGORY:

writer.printCategory(item);}

writer

Builder Pattern

Builder: Schnittstelle für das Erzeugen von Objekten ConcreteBuilder: Konkrete Implementierung der Objekterzeugung

Taentzer Softwarequalität 2015 144

en.wikipedia.org/wiki/Builder_pattern

Patterns für Variantenmanagement

Anforderungen: Redundanzen in Programmen sollen reduziert werden,

indem Gemeinsamkeiten einer Menge von Objekten herausfaktorisiert und nur an einer Stelle beschrieben werden.

Selektion von konkreten Varianten eventuell erst zur Laufzeit

Welche Arten von Redundanzen können auftreten? Strukturen gleichartiger Objekte Algorithmen mit verschiedenen Varianten

Taentzer Softwarequalität 2015 145

Taentzer Softwarequalität 2015 146

Patterns für Variantenmanagement

Superclass: ziehe Gemein-samkeiten von Objekten in eine gemeinsame Ober-klasse

Delegation: leite Aufgaben von Klasse A an Klasse B weiter

(Abstract) Factory: bündele die Erzeugung von zusam-mengehörigen Objekten in einer Klasse

Composite: behandle Teil-Ganzes-Hierarchien, atomare und komponierte Objekte werden gleichartig behandelt

Strategy: erstelle eine gemeinsame Schnittstelle für verschiedene Varianten von Algorithmen

Decorator Pattern: füge zusätzliche Funktionalität während der Laufzeit zu

Ziel: Gemeinsamkeiten von Objekten werden herausgekehrt, sodassverschiedene Objekte gleich behandelt werden können.

Taentzer Softwarequalität 2015 147

Delegation Pattern

Ein Objekt zeigt Funktionalität nach außen, die es intern an andere delegiert.

ein grundlegendes Pattern zur Abstraktion von Implementierungen

Stackpush()pop()

Listadd()remove()

Client

Beispiel: Wie kann man einen Stack implementieren?

stack list

Beispiel: Strukturierung von graphischen Oberflächen

Es soll möglich sein, graphische Sichten hierarchisch aufzubauen. Sichten können Gruppen von Sichten enthalten.

Verschiedene Arten von Sichten sollen möglichst flexibel kombinierbar sein.

Taentzer Softwarequalität 2015 148

Taentzer Softwarequalität 2015 149

Beispiel: Strukturierung von graphischen Oberflächen

Einzelne Sichten und Gruppen von Sichten werden möglichst ähnlich behandelt.

View

display()

PrimitiveView ViewGroup

Button TextView StackView ListView

Beispiel für das Composite Pattern

Composite Pattern

Einzelne Instanzen und Gruppen von Instanzen können gleich behandelt werden.

Varianten: Es kann verschiedene Arten

von atomaren Objekten geben: Unterklassen von Atomic

Es kann verschiedene Arten von zusammengesetzten Objekten geben: Unterklassen von Composite

Taentzer Softwarequalität 2015 150

Component

Atomic Composite

Beispiel: Verschiedene Formatierungen derselben Struktur

Eine graphische Oberfläche soll in verschiedenen Sichten spezifiziert werden.

Eine Formatierung erzeugt eine spezielle Instanz einer Struktur.

Taentzer Softwarequalität 2015 151

Beispiel: Verschiedene Formatierungen derselben Struktur

Taentzer Softwarequalität 2015 152

StructureFormatingStrategy

print()

TreeFormat XMLFormat GraphicalFormat

FormatingStrategy strat;switch output.typecase TREE:

strat = new TreeFormat();strat.print();

case XML://….

Beispiel für das Strategy Patternstrat

Strategy Pattern

Entkopple die Formatierung von der Struktur

Kapselung einer Familie von Algorithmen durch eine Schnittstelle

Ein allgemeines Verhalten wird durch konkretes Verhalten spezialisiert.

Taentzer Softwarequalität 2015 153

en.wikipedia.org/wiki/Strategy_pattern

Beispiel: Verschönerung der Benutzerschnittstelle

Mögliche Verschönerungen für einen ListView: Trenner zwischen Einträgen Scroll Bar, um lange Listen anzuzeigen Ein Suchfeld

Anforderungen: Das Benutzerschnittstellenobjekt soll über die

Verschönerungen nichts wissen. Explosion von Klassen vermeiden: Eine Lösung durch

Vererbung würde eine Unterklasse per Kombination von Verschönerungen erzeugen.

Taentzer Softwarequalität 2015 154

Beispiel: Verschönerung der Benutzerschnittstelle

Taentzer Softwarequalität 2015 155

ApplicationAbstractListView

draw()

ListView ListDecorator- decoratedListView

ScrollBarDecorator SearchDecorator

AbstractListView lv;lv = new SearchDecorator(

new ScrollBarDecorator(new ListView))

Beispiel für das Decorator Pattern

lv

Decorator Pattern

Das Pattern kann einem Objekt weitere Funktionalität hinzufügen.

Alternative zur Vererbung: Unterklassen fügen

Funktionalität während der Übersetzung zu.

Das Decorator-Pattern kann Objekt während der Laufzeit mit neuem Verhalten versehen.

Mehrere Dekorierungen eines Objekts sind möglich.

Verschiedene Reihenfolgen werden berücksichtigt.

Taentzer Softwarequalität 2015 156

en.wikipedia.org/wiki/Decorator_pattern

Taentzer Softwarequalität 2015 157

Zusammenfassung Design Patterns kondensieren das Wissen von

erfahrenen Softwareentwicklern. Design Patterns tragen konstruktiv zur Qualitäts-

sicherung bei. keine nennenswerte Werkzeugunterstützung Links zu Design Patterns

sourcemaking.com/design_patterns Wikipedia-Seiten

Nächste Woche: weitere Design Patterns Refactoring to Patterns