You are on page 1of 79

GDP - Design Patterns in Java

Dr. Bernhard Pfeifer


bernhard.pfeifer@umit.at

UMIT
Institute for Biomedical Engineering

Wintersemester 2006/07
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Inhaltsverzeichnis I

1 Design Patterns - Grundlagen


Allgemeines
Einführung
Arten von Patterns
Periodensystem der Patterns
2 Anti Patterns
Allgemeines
Beispiele
3 Smalltalk
MVC & Smalltalk
4 Katalog der Patterns
5 Creational Patterns
Allgemeines
Factory Pattern

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Inhaltsverzeichnis II
Abstract Factory
Singleton
Prototype

6 Structural Patterns
Allgemeines
Adapter
Bridge
Composite

7 Behavioral Patterns
Allgemeines
Chain of Responsibility
Command
Iterator
Observer

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Inhaltsverzeichnis III
8 Idiom
Idiom in der Softwaretechnik

9 Java - Allgemein

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Allgemeines

Geschichte

Ein Entwurfsmuster (engl. design pattern) beschreibt eine bewährte


Schablone für ein Entwurfsproblem.
Es stellt damit eine wiederverwendbare Vorlage zur Problemlösung dar.
Der Architekt Christopher Alexander hatte in den 1970er Jahren eine
Sammlung von Entwurfsmustern zusammengestellt. Die Hauptaufgabe
dieser Muster ist es, die Bewohner der zu bauenden Strukturen in den
Entwurfsprozess einzubinden. In der Architektur hat sich diese Idee jedoch
bei weitem nicht so verbreitet wie später in der Softwareentwicklung.

Kent Beck und Ward Cunningham griffen 1987 die Ideen Alexanders aus
der Architektur auf und entwickelten Entwurfsmuster für die Erstellung von
grafischen Benutzungsschnittstellen in Smalltalk. Ein Jahr später begann
Erich Gamma [1] mit seiner Promotion an der Universität Zürich über die
generelle Übertragung dieser Methode auf die Softwareentwicklung.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Einführung

Einführung

Ein gutes objektorientiertes Design zu machen ist sehr schwer,


wiederverwendbare objekt-orientierte Software zu bauen ist jedoch noch
schwerer.
Das Auffinden von passenden Objekten, diese in der richtigen Granularität
in Klassen zu packen, Klasseninterfaces zu bauen, Vererbung richtig
einzusetzen und Objekte in die Richtige Beziehung zu setzen, ist die große
Kunst des Programmierens.
Das Design eines Programmes sollte so allgemein wie möglich, jedoch auch
in der Lage sein das Problem, die Aufgabe zu lösen.

Selbst erfahrene Softwareentwickler schaffen es nicht beim ersten Entwurf


die ”richtige” Lösung zu finden - sie verändern den Entwurf einige male,
bis sie zu einem brauchbaren Entwurf gelangen.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Einführung

Einführung ...

Bei der Erstellung von Software sollte man auch ein Prinzip sehr
beherzigen:

Erfinde nicht das Rad ständig neu!

Gute Softwaredesigner verwenden etablierte Lösungen aus der


Vergangenheit und passen diese an die gegebene Problemstellung an.
Wenn einmal eine gute Lösung gefunden wurde, so wird diese wieder und
wieder verwendet.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Einführung

Definition

Ein Pattern beschreibt ein Problem welches immer wieder auftritt und
definiert weiters den Kern der Lösung, damit dieses Muster zum Lösen des
Problems (immer und immer wieder) verwendet werden kann.
Ein gutes Muster sollte
1 ein oder mehrere Probleme lösen,

2 ein erprobtes Konzept bieten,

3 über das rein Offensichtliche hinausgehen,

4 den Benutzer in den Entwurfsprozess einbinden,

5 Beziehungen aufzeigen, die tiefergehende Strukturen und


Mechanismen eines Systems umfassen.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Einführung

Elemente eines Patterns

Ein Pattern besteht aus vier Elementen:


pattern name beschreibt mit seinem Namen das Design-Problem, die
Lösung und die Konsequenz in wenigen Worten.
problem beschreibt, wann das Pattern angewendet werden soll/kann.
Es wird das Problem und der zugehörige Kontext
beschrieben.
solution beschreibt die Elemente, die das Design, die Beziehungen,
die Verantwortlichkeiten und die Zusammenarbeiten
ausmachen. Das Pattern kann somit als ein Template
gesehen werden.
consequences zeigt die Ergebnisse beim Einsatz des Patterns auf.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Arten von Patterns

Arten von Patterns

Es gibt drei Arten von Patterns:

1 Creational Patterns
2 Structural Patterns
3 Behavioral Patterns

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Periodensystem der Patterns

Periodensystem der Patterns

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Allgemeines

Anti - Patterns: Allgemeines

So genannte Anti-Patterns sind das Gegenteil der unter Architektonische


Stile und Muster beleuchteten wünschenswerten Strukturen. Ein
Anti-Pattern steht für eine Struktur auf Entwurfsebene, die eher zu
zerbrechlichen Strukturen, schlechter Verstehbarkeit, allgemein schlechter
Wartbarkeit führt.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Allgemeines

Geschichte

Die ersten Anti-Patterns wurden auf der Object Worls West 1996 von
Michael Akroyd in seinem Vortrag ”AntiPatterns: Vaccinations against
Software Misuse” vorgestellt.
Darin wurde besonders auf das Erkennen von gefährlichen
Softwarekonstrukten, die immer wieder auftreten, hingewiesen.
Anti Patterns gibt es in der IT im speziellen in den Bereichen
Softwareentwicklung, Softwarearchitekturen sowie Projekt- und
Konfigurationsmanagement.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Beispiele

Beispiele

”Poltergeister” sind Wucherungen zahlreicher ”Mini-Klassen”, deren


Instanzen kurze Lebensdauer haben, kaum Verantwortlichkeiten
besitzen und nur flüchtig Beziehungen zu anderen Objekten eingehen.
Sie entstehen durch übermäßige Objektifizierung“ eines Modells und

können beseitigt werden, indem die langlebigen Strukturen in diesem
Geflecht explizit zu Klassen erhoben werden.
Als ”Klumpen” (Blob) werden Module bezeichnet, welche übermäßig
viele Aufgaben wahrnehmen. Dies ist beispielsweise an der Anzahl von
Attributen oder Methoden einer Klasse erkennbar, die in keinem
inhaltlichen Zusammenhang stehen. Die Blob-Klasse hält Instanzen
anderer Klassen, welche die meiste Zeit nicht benötigt werden und
nur bei spezifischen Teilaufgaben des Blobs angesprochen werden.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Beispiele

Beispiele ...

Onion: neue Funktionalität wird um (oder über) die alte gelegt.


dadurch entstehen verschiedene ”Zwiebel-Schalen”, die von den
Programmierern um den Kern herum gelegt werden. Dadurch
entstehen eine Vielzahl von Versionen über die Jahre.
Copy & Paste Programmierung: Der Code wird nicht neu entwickelt;
es wird bereits exisitierender Code aus Passagen herauskopiert.
Dadurch kommt es vor, dass Fehler mitkopiert werden, und dass der
Code nicht optimal (für die Fragestellung) ist.
Lavafluss: Beschreibt den Umstand, dass in einer Anwendung immer
mehr ”toter Quelltext”herumliegt, der nicht mehr genutzt wird. Statt
ihn zu löschen werden im Programm immer mehr Verzweigungen
eingebaut, die um den besagten Quelltext herumlaufen oder auf ihn
aufbauen (englisch Lava flow).

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Beispiele

Beispiele ...

Switch-Statement in Java: Verhalten von Objekten gemäß Ihres


Status (state) sollten mit Status Objekten und dem State Pattern
gesteuert werden, nicht mit konditionalem Code.
Magic Values: Hierbei handelt es sich um Daten (Literale) mit
besonderer Bedeutung. Sie sind hartkodiert (hardcoded) und nur mit
besonderem Wissen über die konkrete Verwendung zu verstehen.
Reservierte Wörter: Die Verwendung von reservierten Wörtern in
Anweisungen kann zu schwer zu findenden Fehlern führen.
Spaghetti Code - Big Ball Of Mud: schwer zu lesen und zu verstehen,
unstrukturiert und fehleranfällig.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

MVC & Smalltalk

Einführendes Beispiel

Das Model View Controller (MVC) Muster wird verwendet, um


Benutzerinterfaces in Smalltalk-80 zu bauen.

Das MVC Pattern besteht aus drei Komponenten:

model Applikationsobjekt
view Bildschrimpräsentation
controller definiert den Weg, wie auf Benutzerinteraktionen reagiert
werden soll

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

MVC & Smalltalk

Einführendes Beispiel ...

Ein großes Feature des MVC Patterns ist, dass verschiedenste Views
geschachtelt werden können.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Katalog

Abstract Factory Es stellt eine Schnittstelle zur Erzeugung einer Familie


von Objekten bereit. Die konkreten Klassen werden nicht
spezifiziert.
Adapter Konvertiert die Schnittstelle einer Klasse in eine
Schnittstelle, die der Client erwartet. Dadurch können
Klassen zusammenarbeiten, welche aufgrund von
Inkompatibilitäten nicht operieren könnten.
Bridge Das Muster ermöglicht die Trennung der Implementation
von ihrer Abstraktion (Schnittstelle).
Builder Es trennt die Konstruktion eines komplexen Objektes von
dessen Repräsentation. Dadurch kann derselbe
Konstruktionsprozess verschiedene Repräsentationen
erzeugen.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Katalog ...

Composite Es wird angewendet um Teil-Ganzes-Hierarchien zu


repräsentieren, indem Objekte zu Baumstrukturen
zusammengefügt werden. Die Grundidee des
Composite-Pattern ist, in einer abstrakten Klasse sowohl
primitive Objekte als auch ihre Behälter zu repräsentieren.
Somit können sowohl einzelne Objekte, als auch ihre
Kompositionen einheitlich behandelt werden.
Decorator Das Muster ist eine flexible Alternative zur
Unterklassenbildung, um die Funktionalität einer Klasse zu
erweitern.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Katalog ...

Facade Wenn ein Subsystem viele technisch orientierte Klassen


enthält, die selten von außen verwendet werden, hilft es,
eine Fassade zu verwenden. Die Fassade ist eine Klasse mit
ausgewählten Methoden, die eine häufig benötigte
Untermenge an Funktionalität des Subsystems umfasst. Sie
delegiert die Funktionalität an andere Klassen des
Subsystems und vereinfacht dadurch den Umgang mit dem
Subsystem.
Factory Method Das Muster definiert eine Schnittstelle zur Erzeugung
eines Objektes, wobei es den Unterklassen überlassen bleibt,
von welcher Klasse das zu erzeugende Objekt ist. Der
Begriff Fabrikmethode wird in der Praxis auch oft für eine
statische Methode verwendet, die ein neues Objekt erzeugt.
In diesem Fall ist keine Verwendung von Unterklassen bzw.
Polymorphismus vorgesehen.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Katalog ...

Flyweight Es wird verwendet, wenn eine große Anzahl von Objekten


benötigt wird, die sich bestimmte invariante Informationen
teilen und eine herkömmliche Implementierung
unverhältnismäßig viel Speicher erfordern würde.
Interpreter Ein Interpreter (im Sinne der Softwaretechnik) ist ein
Software-Programm, das einen Programm-Quellcode im
Gegensatz zu Assemblern oder Compilern nicht in eine auf
dem System direkt ausführbare Datei umwandelt, sondern
den Quellcode einliest, analysiert und ausführt. Die Analyse
des Quellcodes erfolgt also zur Laufzeit des Programms.
Mediator Das Muster dient der Steuerung der Kommunikation und
des kooperativen Verhaltens von Objekten. Dabei
kommunizieren bzw. kooperieren die Objekte nicht direkt,
sondern über einen Vermittler.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Katalog ...

Memento wird angewendet, um den internen Zustand eines Objektes


zu erfassen und zu externalisieren, ohne dabei seine
Kapselung zu verletzen. Somit kann das Objekt später in
diesen Zustand zurückversetzt werden.
Observer Es ermöglicht die Weitergabe von Änderungen eines
Objekts an abhängige Objekte.
Proxy stellt ein Surrogat bzw. Platzhalter für den Zugriff auf ein
anderes Objekt zur Verfügung.
Singleton Stellt sicher, dass eine Klasse nur einmal (bzw. definierte
male) instanziert werden kann.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Katalog ...

Strategy Das Muster definiert eine Familie austauschbarer


Algorithmen. Strategie-Objekte werden ähnlich wie
Klassenbibliotheken verwendet. Im Gegensatz dazu handelt
es sich jedoch nicht um externe Programmteile, die als ein
Toolkit genutzt werden können, sondern um integrale
Bestandteile des eigentlichen Programms, die deshalb als
eigene Objekte definiert wurden, damit sie durch andere
Algorithmen ausgetauscht werden können.
Template Method Es wird in einer abstrakten Klasse ein Skelett eines
Algorithmus in einer Operation definiert. Die konkrete
Ausformung der einzelnen Schritte des Algorithmus wird an
die Unterklassen delegiert. Dies ermöglicht, einzelne
Schritte eines Algorithmus zu modifizieren oder zu
überschreiben, ohne dass die grundlegende Struktur des
Algorithmus verändert wird.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Allgemeines

Allgemeines

Creational Patterns stellen einen Weg zur bestmöglichen Erzeugung von


Objekten bereit. Diese Gruppe der Patterns spielt insofern eine Rolle, da
ein Programm nicht abhängig davon sein soll, wie Objekte erzeugt und
arrangiert werden.
In Java ist die einfachste Möglichkeit ein Objekt zu erzeugen wie folgt:
1 O b j e c t myObject = new O b j e c t ( ) ;

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Factory Pattern

Factory Pattern

Das Factory Pattern erzeugt je nach übergebenen Daten das zugehörige


relevante Objekt.

Sei x die Oberklasse und xy und xz die abgeleiteten Klassen. Die Factory
ist nun eine Klasse, welche entscheidet, welche dieser Subklassen
zurückgegeben werden soll. Dazu werden die übergebenen Argumente
ausgewertet. Die Methode getClass () retourniert nun aufgrund des
Parameters abc eine Instanz der Klasse x.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Factory Pattern

Factory Pattern ... Beispiel

Nehmen wir an, wir haben eine Eingabeform, in welche man Vorname
Nachname als auch Nachname, Vorname eingeben kann. Man kann also
immer entscheiden, in welcher Reihenfolge die Namen eingegeben werden,
da diese in der Form Nachname, Vorname durch einen Beistrich getrennt
werden.
1 c l a s s Namer {
2 protected String l a s t ;
3 protected String f i r s t ;
4 public String getFirst () { return f i r s t ; }
5 public String getLast () { return l a s t ; }
6 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Factory Pattern

Factory Pattern ... Beispiel

Nun erstellen wir zwei Klassen, die den Namen in zwei Teile zu splitten
imstande sind.
1 c l a s s F i r s t L a s t e x t e n d s Namer {
2 FirstLast ( String s ) {
3 int i = s . lastIndexOf (” ” );
4 i f ( i > 0) {
5 f i r s t = s . s ubs tr i ng (0 , i ) . trim ( ) ;
6 l a s t = s . s u b s t r i n g ( i +1). t r i m ( ) ;
7 } else {
8 f i r s t = ”” ;
9 l a s t name l a s t = s ;
10 }
11 }
12 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Factory Pattern

Factory Pattern ... Beispiel

1 c l a s s L a s t F i r s t e x t e n d s Namer {
2 LastFirst ( String s ) {
3 i n t i = s . indexOf (” ,” ) ;
4 i f ( i > 0) {
5 l a s t = s . s ubs tr i ng (0 , i ) . trim ( ) ;
6 f i r s t = s . substring ( i + 1). trim ( ) ;
7 } else {
8 last = s ;
9 l a s t name f i r s t = ” ” ;
10 }
11 }
12 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Factory Pattern

Factory Pattern ... Beispiel


Die Erzeugung der Factory Klasse ist nun sehr einfach zu machen. Der
Beistrich entscheidet welche Instanz erzeugt werden soll.
1 c l a s s NameFactory {
2 p u b l i c Namer getNamer ( S t r i n g e n t r y ) {
3 i n t i = entry . indexOf (” ,” ) ;
4 i f ( i >0) r e t u r n new L a s t F i r s t ( e n t r y ) ;
5 else
6 r e t u r n new F i r s t L a s t ( e n t r y ) ;
7 }
8 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Factory Pattern

Factory Pattern

Das Factor Pattern sollte verwendet werden, wenn:


eine Klasse nicht wissen kann, welches Objekt erzeugt werden soll.
eine Klasse seine Unterklassen benötigt, um spezifizieren zu können,
welches Objekt erzeugt werden soll.
eine Klasse abstrakt ist und das Pattern eine konkrete Klasse
zurückgeben muss.
die Basisklasse unzureichende Methoden bereitstellt und daher auf die
Methode der Unterklasse zugegriffen werden muss.
Parameter der Factory Klasse übergeben werden, welche sodann
feststellt, welches Objekt erzeugt werden soll.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Abstract Factory

Abstract Factory

Das Abstract Factory Pattern ist um eine Abstraktionsstufe höher zu sehen


als das Factory Pattern.
Es kann benutzt werden, wenn man eine von vielen Klassen retournieren
will, von denen jede wiederum verschiedene Objekte zurückliefern kann.
Die Abstract Factory ist ein Factory Objekt, welches eines von mehreren
Factories zurückgibt.

Ein klassisches Anwednungsgebiet des Abstract Factory Patterns ist, wenn


eine Applikation verschiedene Look-and-Feels unterstützen soll. Man teil
der Factory mit, dass man den Windows oder MAC-OSX Look-and-Feel
haben will und es wird ein entsprechendes Look-and-Feel Objekt
zurückgegeben.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Singleton

Singleton

Es soll sichergestellt werden, dass es genau eine Instanz gibt.


Es gibt genügend Fälle, wo genau eine Instanz einer Klasse benötigt wird:
obwohl es in einem Netzwerk mehrere Drucker geben kann, sollte sich dort
nur ein Printspooler befinden; ein Digitalfilter soll genau einen A/D
Konverter haben; ...
1 class Singleton {
2 protected s t a t i c Singleton instance = n u l l ;
3
4 protected Singleton () { . . . }
5
6 public s t a t i c synchronized Singleton getInstance () {
7 i f ( i n s t a n c e == n u l l ) {
8 i n s t a n c e = new S i n g l e t o n ( ) ;
9 }
10 return instance ;
11 }
12
13 ...
14 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Prototype

Prototype

Wenn die Erzeugung einer Instanz sehr zeitaufwändig ist, so kann das
Prototype Pattern verwendet werden.
Als Beispiel sei eine Datenbank gegeben, welche oftmals abgefragt werden
muss, um ein Antwortobjekt erzeugen zu können. Liegt die Antwort als
eine Tabelle bzw. ein ResultSet vor, so kann es vorkommen, dass man
dieses Objekt manipulieren möchte, um andere Fragestellungen ebenfalls
beantworten zu können.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Prototype

Prototype Beispiel

In unserer Datenbank wollen wir Schwimmer verwalten. Jeder Schwimmer


gehört zu einer Liga, und schwimmt sehr viele Längen und Distanzen
während einer Saison, die gespeichert werden wollen.
Die ”besten” Schwimmer sind gruppiert nach Geschlecht und Alter, alle
Schwimmer haben während des Jahres Geburtstag wodurch sich das Alter
ändert und diese dadurch möglicherweise einer anderen Altersklasse
zugehörig werden.
Die benötigte Rechenzeit, eine solche Tabelle zu erzeugen ist dadurch sehr
hoch.
Ein umgruppieren, umsortieren, ... sollte daher nicht in einer weiteren
Abfrage an die Datenbank münden.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Prototype

Prototype Beispiel ...


Man kann nun eine Kopie des Java Objektes machen. Dazu verwendet
man die clone () Methode.
1 Jobj1 j1 = ( Jobj ) jo . clone ( ) ;

Die clone () Methode hat jedoch folgende Restriktionen:


1 Sie ist protected und kann daher nur innerhalb der eigenen Klasse
oder des Moduls in dem die Klasse enthalten ist aufgerufen werden.
2 Es lassen sich nur Objekte klonen, welche deklarieren, dass die das
Cloneable Interface implementieren.
3 nichtklonbare Objekte werfen eine CloneNotSupported Exception

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Prototype

Prototype Beispiel ...


Daher könnte man nun die aktuelle Klone Methode innerhalb der Klasse
verpacken, in der die Klone Methode aufgerufen werden kann.
1 p u b l i c c l a s s SwimData i m p l e m e n t s C l o n e a b l e {
2 p u b li c Object clone () {
3 try {
4 return super . clone ( ) ;
5 } catch ( Exception e ) {
6 System . o u t . p r i n t l n ( e . g e t M e s s a g e ( ) ) ;
7 return null ;
8 }
9 }
10 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Prototype

Prototype Beispiel ...


Nun erstellen wir eine Klone Methode für das SwimData Objekt, jedoch
unter dem Namen cloneMe (). Der Grund dafür liegt darin begründet, dass
die clone () Methode immer den Typ Object zurückliefert. Um nun den
Type Cast dem ”Anwender” der Methode zu ersparen müssen wir eine
andere Bezeichnung verwenden.
1 p u b l i c SwimData cloneMe ( ) {
2 try {
3 r e t u r n ( SwimData ) s u p e r . c l o n e ( ) ;
4 } catch ( Exception e ) {
5 System . o u t . p r i n t l n ( e . g e t M e s s a g e ( ) ) ;
6 return null ;
7 }
8 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Prototype

Prototype Beispiel ...


Nun erstellen wir ein kleiner Programm, welches Daten aus der Datenbank
ausliest und das Ergebnisobjekt klont.
1 c l a s s Swimmer {
2 S t r i n g name ;
3 i n t age ;
4 String club ;
5 f l o a t time ;
6 boolean female ;
7 }

1 p u b l i c c l a s s SwimData i m p l e m e n t s C l o n e a b l e {
2 V e c t o r swimmers ;
3 p u b l i c SwimData ( S t r i n g f i l e n a m e ) {
4 S t r i n g s = ” ” ; swimmers = new V e c t o r ( ) ;
5 I n p u t F i l e f = new I n p u t F i l e ( f i l e n a m e ) ; s= f . r e a d L i n e ( ) ;
6 w h i l e ( s != n u l l ) {
7 swimmers . a d d E l e m e n t ( new Swimmer ( s ) ) ;
8 s= f . r e a d L i n e ( ) ;
9 }
10 f . close ();
11 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Prototype

Prototype Beispiel ...


Nun könnte man zum Beispiel (vorausgesetzt die notwendigen get
Methoden wurden implementiert) die Daten einer ListBox übergeben.
1 swList . removeAll ( ) ;
2 f o r ( i n t i = 0 ; i < s d a t a . s i z e ( ) ; i ++) {
3 sw = s d a t a . getSwimmer ( i ) ;
4 s w L i s t . a d d I t e m ( sw . getName ()+ ” ”+sw . getTime ( ) ) ;
5 }

Aufgrund einer Aktion benötigt man die Daten nun in einer anderen
Sichtweise - das erneute Erstellen des Objektes dauert aber zu lange, daher
muss geklont werden:
1 s x d a t a = ( SwimData ) s d a t a . c l o n e ( ) ;
2 sxdata . sortByTime ( ) ;
3 c l o n e L i s t . removeAll ( ) ;
4 f o r ( i n t i =0; i < s x d a t a . s i z e ( ) ; i ++) {
5 sw = s x d a t a . getSwimmer ( i ) ;
6 c l o n e L i s t . a d d I t e m ( sw . getName ()+ ” ”+sw . getTime ( ) ) ;
7 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Allgemeines

Allgemeines

Structural Patterns werden verwendet, um komplexe Objektstrukturen


erzeugen zu können.
Man unterscheidet zwischen class- und object-Patterns. Class-Patterns
beschreiben, wie Vererbung benutzt werden kann, um bessere
Programmschnittstellen erzeugen zu können. Object-Patterns wiederum
beschreiben, wie Objekte bzgl. ihrer Funktionalitäten zusammengefügt
werden müssen.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Adapter

Adapter

Das Adapter Pattern wird dazu verwendet, um Interfaces verschiedener


Klassen aufeinander abbilden zu können. Adapter werden immer dann
verwendet, wenn nicht zusammengehörige Klassen in einem Programm
zusammenarbeiten müssen.
Das Konzept des Adapter Patterns ist sehr einfach: man schreibt eine
Klasse, welche die geforderte Schnittstelle bereitstellt, mit der die andere
Klasse sodann zusammenarbeiten kann.

Es gibt zwei Möglichkeiten das Adapter Pattern zu realisieren: mit Hilfe


von Vererbung und mittels Komposition.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Adapter

Adapter Beispiel

Das Programm, in das wir eine fremde Klasse einbauen wollen, sei ein
Zeicheneditor. Dieser soll über die Möglichkeit verfügen, grafische Objekte wie
z.B. Linien zu erzeugen. Sämtliche grafischen Objekte erben ihre Schnittstelle
von einer abstrakten Klasse GrafischesObjekt. Zusätzlich möchten wir nun
auch Texte in unsere Grafiken einbauen. Hierfür soll eine bereits bestehende
Klasse TextAnzeige verwendet werden. Diese Klasse erzeugt jedoch Textobjekte
und ihre Schnittstelle ist inkompatibel mit unserer abstrakten Klasse
GrafischesObjekt. Somit benötigen wir einen Adapter, um die Schnittstelle
der Klasse TextAnzeige mit unserem Zeicheneditor kompatibel zu machen.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Adapter

Adapter Beispiel ...

Die Adapterklasse nennen wir Text. Sie ist selbst eine Unterklasse von
GrafischesObjekt und erzeugt eine Instanz von TextAnzeige. Text
stellt das vom Editor geforderte Interface bereit und kann gleichwertig zu
anderen grafischen Objekten im Editor behandelt werden.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Adapter

Adapter - Klassenadapter

Der Klassenadapter wird mittels Mehrfachvererbung verwirklicht. Das führt


dazu, dass er in Java nicht verwirklicht werden kann.
Der Klassenadapter passt genau eine zu adaptierende Klasse an eine
Zielklasse an. Somit ist er recht unflexibel. Er ermöglicht es, Teile der zu
adaptierenden Klasse zu überschreiben.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Adapter

Adapter - Objektadapter

Der Objektadapter verwendet hingegen Objektkomposition. Dies


ermöglicht es dem Adapter, mit mehreren adaptierten Klassen zu arbeiten.
Dadurch kann der Adapter allen adaptierten Klassen zu mehr
Funktionalität verhelfen.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Adapter

Adapter - Spezielle Adapter

Steckbare Adapter Wenn man eine Klasse möglichst allgemein wieder


verwendbar schreiben möchte, kann man sie mit einem
steckbaren Adapter ausstatten. Hierzu gibt man dieser
Klasse abstrakte Methoden, die ein Adapter später
implementieren muss.
n-Weg Adapter Eine Adapterklasse kann mehrere Interfaces
implementieren, um so für zwei oder mehr Klienten nutzbar
zu sein. Dies nennt man einen n-/zwei-Weg-Adapter. Jeder
normale ein- Weg-Adapter ist im Prinzip ein Spezialfall des
n-Weg-Adapters.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Adapter

Adapter ... Beispiel ...

1 public abstract class GrafischesObjekt {


2 p u b l i c a b s t r a c t v o i d rahmen ( ) ;
3 public abstract void zeichne ( ) ;
4 }
5
6 p u b l i c c l a s s TextAnzeige {
7 private String text ;
8 public int gibBreite () {
9 // l i e f e r t d i e B r e i t e von t e x t z u r \”{u} ck
10 }
11 public void schreibeMich ( int x , int y ) {
12 // s c h r e i b t t e x t an d i e a n g e g e b e n e n K o o r d i n a t e n
13 }
14 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Adapter

Adapter ... Beispiel ...

1 c l a s s Text e x t e n d s G r a f i s c h e s O b j e k t {
2 p r i v a t e TextAnzeige textObjekt ;
3
4 p u b l i c Text ( ) {
5 t e x t O b j e k t = new T e x t A n z e i g e ( ) ;
6 }
7 p u b l i c v o i d rahmen ( ) {
8 // r u f t z . B . t e x t O b j e k t . g i b B r e i t e ( ) a u f
9 }
10 public void zeichne () {
11 // r u f t z . B . t e x t O b j e k t . z e i c h n e M i c h ( ) a u f
12 }
13 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Bridge

Bridge

Das Bridge Pattern macht eine Trennung von Abstraktion und


Implementation, um beiden eine unabhängige Weiterentwicklung zu
ermöglichen.
Dieses Pattern ist auch als Handle bzw. Body Pattern in der Literatur
bekannt.

Beispiel: Für die Entwicklung eines Editor werden eine Klasse Window
und diverse Subklassen wie IconWindow, DialogWindow usw. benötigt.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Bridge

Bridge Beispiel

Der Editor soll nun in verschiedenen Windowsumgebungen (X Windows,


PM) laufen, ohne jeweils individuell kompiliert werden zu müssen.

Jetzt entstehen jedoch plötzlich Nachteile bei der klassichen


Vorgehensweise:
Erweiterungen, wie Subklassen machen den Code schnell zu
kompliziert, da für jede Umgebung je eine eigene Subklasse nötig wird
Der Code wird Plattformabhängig, dies belastet den Entwickler
unnötig, und Portierungen oder Unterstützung für neue Umgebungen
werden schwierig.
Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Bridge

Bridge Beispiel ...

Die Lösung für unser Beispiel stellt nun aber das Bridge Pattern bereit:
Trennung von Abstraktion und konkreter Umsetzung; d.h. Spaltung der
Klassen in verschiedene Hierarchien.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Bridge

Bridge Beispiel ...

Kontext:

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Bridge

Bridge

Das Bridge Pattern ist besonders sinnvoll einzusetzen wenn


permanente Bindung an eine Implementierung vermieden werden soll.
sowohl die Abstraktion als auch Implementierung erweiterbar sein
sollen.
Änderung der Implementierung (z.B. Plattform) keine Änderungen im
Client notwendig machen soll.
Eine Implementierung von verschiedenen Objekten geteilt werden soll.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Composite

Composite

Der Grundgedanke beim Composite ist, dass Einzelelemente und


zusammengesetzte Elemente vom Client gleich behandelt werden sollen,
ohne dass er den Unterschied ”merkt”.
Sowohl die Einzelelemente als auch die zusammengesetzten Elemente
implementieren das gleiche Interface (Component). Zusammengesetzte
Elemente implementieren ein zusätzliches Interface (Composite), das
Operationen auf der Elementzusammenstellung ermöglicht. Client operiert
nicht mit den konkreten Typen sondern mit dem gemeinsamen Interface
(Component).

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Composite

Composite - Klassendiagramm

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Composite

Composite Beispiel

1 public interface Ingredient {


2 float getPrice ();
3 }
4
5
6 import j a v a . u t i l .∗;
7 p u b l i c a b s t r a c t c l a s s C o m p o s i t e I n g r e d i e n t implements I n g r e d i e n t {
8 p r iv at e Vector c h i l d r e n = n u l l ;
9 public CompositeIngredient () {
10 c h i l d r e n = new V e c t o r ( ) ;
11 }
12
13 public float getPrice () {
14 f l o a t sum = 0 ;
15 Iterator iterator = null ;
16 f o r ( i t e r a t o r = c h i l d r e n . i t e r a t o r ( ) ; i t e r . hasNext ( ) ; ) {
17 sum += ( ( I n g r e d i e n t ) ( i t e r . n e x t ( ) ) ) . g e t P r i c e ( ) ;
18 }
19 r e t u r n ( sum ) ;
20 }
21
22 p u b l i c v o i d a d d I n g r e d i e n t ( I n g r e d i e n t i ){
23 c h i l d r e n . add ( i ) ;
24 }
25
26 p u b l i c v o i d r e m o v e I n g r e d i e n t ( I n g r e d i e n t i ){
27 c h i l d r e n . remove ( i ) ;
28 }
29 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Composite

Composite Beispiel

1 p u b l i c c l a s s F l o u r implements I n g r e d i e n t {
2 public float getPrice () {
3 return (0.59 f );
4 }
5 }
6
7 ...
8
9 p u b l i c c l a s s Cake e x t e n d s C o m p o s i t e I n g r e d i e n t {
10 p u b l i c Cake ( ) {
11 t h i s . a d d I n g r e d i e n t ( new Dough ( ) ) ;
12 }
13 }
14
15 ....

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Composite

Composite

Dieses Pattern soll/kann eingesetzt werden, wenn


hierarchisch organisierte Objekte vorliegen
Eltern-Objekte sich wie Kind-Objekte verhalten
die Hierarchie einfach erweiterbar sein soll

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Allgemeines

Allgemeines

Behavioral Patterns stellen die Kommunikation zwischen Objekten her und


helfen bei der Steuerung des Ablaufs der Kommunikation.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Chain of Responsibility

Chain of Responsibility
Entkoppelt die Anforderung des Senders vom Empfänger. Basierend auf
den gesendeten Daten wird ein Empfänger - datengetrieben - ausgewählt.
1 p u b l i c c l a s s Matter {
2 private int size ;
3 private int quantity ;
4
5 public int getSize () {
6 return size ;
7 }
8
9 public void s e t S i z e ( int s i z e ) {
10 this . size = size ;
11 }
12
13 public int getQuantity () {
14 return quantity ;
15 }
16
17 public void setQuantity ( int quantity ) {
18 this . quantity = quantity ;
19 }
20 }
21
22
23 p u b l i c c l a s s S i l l {
24 // E v e r y t h i n g i s c o l l e c t e d h e r e .
25 p u b l i c void c o l l e c t ( Matter g r a v e l ) { . . .
26 }
27 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Chain of Responsibility

Chain of Responsibility
Entkoppelt die Anforderung des Senders vom Empfänger. Basierend auf
den gesendeten Daten wird ein Empfänger - datengetrieben - ausgewählt.
1 p u b l i c c l a s s F i l t e r 1 extends Sill {
2 private int size ;
3
4 public Filter1 ( int size ) {
5 this . size = size ;
6 }
7
8 p u b l i c void c o l l e c t ( Matter g r a v e l ) {
9 f o r ( i n t i = 0 ; i < g r a v e l . g e t Q u a n t i t y ( ) ; i ++) {
10 i f ( gravel . getSize () < size ) {
11 super . c o l l e c t ( g r a v e l ) ;
12 } else {
13 // c o l l e c t h e r e . t h a t means , o n l y m a t t e r w i t h l e s s
14 // s i z e w i l l p a s s . . .
15 }
16 }
17 }
18 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Command

Command

Der Klient ruft ein spezielles Modul durch Benutzung eines Kommandos.
Der Klient übergibt dabei die Anfrage (Request), und dieser request wird
als Kommando weitergegeben. Dieser Kommando-Request wird auf die
benötigten Module gemappt und entsprechend ausgewertet.

Ein klassisches Beispiel ist ein Restaurant. Ein Kunde geht in das
Restaurant und bestellt sich etwas zu essen. Die Bedienung nimmt die
Bestellung entgegen (=Kommando) und übergibt die Aufgabe dem Koch
in der Küche. Der Koch wiederum kocht das Menü (bzw. die Menüs) und
übergibt die fertigen Gerichte dem Kellner, der dies dem Kunden
weiterreicht.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Command

Command Beispiel

1 p u b l i c c l a s s Order {
2 p r i v a t e S t r i n g command ;
3
4 p u b l i c O r d e r ( S t r i n g command ) {
5 t h i s . command = command ;
6 }
7 }
8
9 p u b l i c c l a s s Waiter {
10 p u b l i c Food t a k e O r d e r ( Customer c u s t , O r d e r o r d e r ) {
11 Cook cook = new Cook ( ) ;
12 Food f o o d = cook . p r e p a r e O r d e r ( o r d e r , t h i s ) ;
13 return food ;
14 }
15 }
16
17 p u b l i c c l a s s Cook {
18 p u b l i c Food p r e p a r e O r d e r ( O r d e r o r d e r , W a i t e r w a i t e r ) {
19 Food f o o d = ge tCo okedFood ( o r d e r ) ;
20 return food ;
21 }
22
23 p u b l i c Food getCook edFo od ( O r d e r o r d e r ) {
24 Food f o o d = new Food ( o r d e r ) ;
25 return food ;
26 }
27 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Iterator

Iterator

Das Iterator Pattern wird verwendet, um durch eine Daten-Collection


mittels einheitlichen Dateninterface, ohne die darunterliegende
Implementierung kennen zu müssen, iterieren zu können.
Der Iterator sollte als Interface implementiert werden.
Dieses Pattern ist ein sehr wichtiges, da es in fast jeder alltäglichen
Situation vorkommt.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Iterator

Iterator Beispiel
Wir wollen hier eine Fernbedienung realisieren - klassiches Channelhopping!
1 public interface Iterator {
2 p u b l i c Channel nextChannel ( i n t c u r r e n t C h a n n e l ) ;
3 p u b l i c Channel prevChannel ( i n t c u r r e n t C h a n n e l ) ;
4 }
5
6 p u b l i c C h a n n e l S u r f e r implements I t e r a t o r {
7 p u b l i c Channel nextChannel ( i n t c u r r e n t C h a n n e l ) {
8 C h a n n e l c h a n n e l = new C h a n n e l ( c u r r e n t C h a n n e l +1);
9 return channel ;
10 }
11
12 p u b l i c Channel prevChannel ( i n t c u r r e n t C h a n n e l ) {
13 C h a n n e l c h a n n e l = new C h a n n e l ( c u r r e n t C h a n n e l −1);
14 return channel ;
15 }
16 }
17
18 p u b l i c c l a s s R e m o t e C o n t r o l {
19 private ChannelSurfer s u r f e r ;
20 private Settings settings ;
21
22 p u b l i c RemoteControl ( ) {
23 s u r f e r = new C h a n n e l S u r f e r ( ) ;
24 s e t t i n g s = new S e t t i n g s ( ) ;
25 }
26
27 p u b l i c getProgram ( C h a n n e l S u r f e r s u r f e r ) {
28 r e t u r n new Program ( s u r f e r . n e x t C h a n n e l ( ) ) ;
29 }
30 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Iterator

Iterator Beispiel ...

Jedem ist bekannt, dass jeder Fernsehkanal mit einem Programm


untrennbar verbunden ist - und normalerweise will man ein Programm und
nicht die Kanalnummer sehen.

Normalerweise hat ein Iterator in Java die Methoden


hasMoreElements () und nextElement () implementiert.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Observer

Observer

Problemstellung: Falls mehrere Objekte von einem Anderen abhängig sind


und sich dieses ändert, kommt es oft vor, dass die Konsistenz zwischen
den Objekten aufrecht erhalten werden muss und sich abhängigen Objekte
auch ändern müssen.
Lösung: Dieses kann durch 2 Methoden erreicht werden. Die erste ist eine
sehr enge Kopplung zwischen den Objekten, welche die
Wiederverwendbarkeit stark einschränkt. Die zweite entkoppelt die Objekte
zwar, aber durch die Abhängigkeiten müssen die Objekte von den
Änderungen erfahren (benachrichtigt werden). Beim Observer-Pattern ist
es nicht notwendig, dass das Subjekt die Beobachter kennt. Dadurch wird
die hohe Entkopplung erreicht.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Observer

Observer

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Observer

Observer Beispiel

Die Darstellung einer Zahlenmenge kann man auf viele Arten und Weisen
realisieren.

Werden jetzt die Daten in der Datenbank aber geändert (b = 10), sollen
alle Ansichten natürlich auch die neuen Daten wiedergeben. Dazu werden
die Ansichtsobjekte (Beobachter) vom Datenobjekt (Subjekt)
benachrichtigt (notify), das sich etwas an den Daten geändert hat.
Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Observer

Observer Beispiel ...

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Observer

Observer Struktur
Das Subjekt kennt seine Beobachter nicht, sondern bietet den Beobachtern lediglich eine
Schnittstelle zum An- und Abmelden. Es können beliebig viele Objekte ein Subjekt beobachten.
Der Beobachter stellt eine Schnittstelle zur Verfügung, die aufgerufen wird, wenn das Subjekt
aktualisiert worden ist.
Das Konkrete-Subjekt speichert den Zustand und benachrichtigt seine Beobachter, falls sich der
Zustand geändert hat.
Der Konkrete-Beobachter implementiert die Aktualisierungsschnittstelle der Beobachterklasse, um
den gespeicherten Zustand konsistent zum Zustand des Subjektes zu halten. Dazu wird der
momentane Zustand und eine Referenz auf das Subjekt gespeichert.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Observer

Observer Vorteile
Subjekt und Beobachter können unabhängig voneinander definiert, geändert und
wiederverwendet werden. Man kann neue Beobachter, bzw. neue Subjekte hinzufügen ohne
diese abändern zu müssen. Außerdem können beliebig viele Beobachter demselben Subjekt
zugeordnet werden.
Subjekt und Beobachterklassen sind nicht eng aneinander gekoppelt. Deswegen ist es
möglich, dass sie zu unterschiedlichen Abstraktionsschichten gehören können. Befindet sich
z.B. der Beobachter in einer höher liegenden Schicht als das Subjekt so ist es trotzdem
möglich, dass das Subjekt den Beobachter informiert. Dabei werden die Schichten nicht
verletzt.
Eine von einem Subjekt gesendete Nachricht muss ihre Empfänger nicht weiter spezifizieren.
Die Nachricht wird automatisch an alle die Objekte weitergeleitet, die sich für sie registriert
haben. Das Subjekt beachtet nicht, wie viele interessierte Objekte es gibt. Dadurch wird es
möglich, jederzeit Beobachter an – oder abzumelden. Die Beobachter entscheiden, ob sie
Nachrichten behandeln oder ignorieren.
Man kann die Verwaltungsschnittstelle des Subjekts erweitern, so dass sich die Beobachter
nur für bestimmte Ereignisse anmelden, also nur für solche, die für sie von Bedeutung sind.
Das Subjekt informiert nun immer nur die Beobachter, die sich für dieses bestimmte Ereignis
eingetragen haben.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Observer

Observer Nachteile

Es ist möglich, dass eine Zustandsänderung des Subjekts aufwendige


Folgen hat. Eine scheinbar harmlose Operation auf dem Subjekt kann
zu einer Kaskade von Aktualisierungen bei den Beobachtern und den
von ihnen anhängigen Objekten führen. Des Weiteren kann es zu
unnötigen Aktualisierungen kommen, z.B. durch schlecht definierten
Abhängigkeiten. Dieses Problem wird dadurch noch erschwert, dass
ein einfaches Aktualisierungsprotokoll nicht beschreibt, was genau sich
im Subjekt geändert hat. Damit die Benutzer herausfinden können,
was genau sich geändert hat, braucht man ein erweitertes Protokoll.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Observer

Observer Beispiel ...


Der Beobachter b möchte das Ding d beobachten und über dessen Zustandsänderungen informiert werden:

1 p u b l i c c l a s s ObserverAnwendung {
2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
3 Ding d = new Ding ( ) ;
4 B e o b a c h t e r b = new B e o b a c h t e r ( ) ;
5 d . addObserver (b ) ;
6 d . s e t V a l u e ( ” Observer Test ” ) ;
7 }
8 }
9
10 // Ding i s t b e o b a c h t b a r !
11 i m p o r t j a v a . u t i l . O b s e r v a b l e ;
12 p u b l i c c l a s s Ding e x t e n d s O b s e r v a b l e {
13 private String value ;
14 public void setValue ( String s ) {
15 value = s ;
16 setChanged ( ) ;
17 notifyObservers ( value );
18 }
19 }
20
21
22 // d e r B e o b a c h t e r kann d i e B e n a c h r i c h t i g u n g i n c l .
23 // A b s e n d e r a d r e s s e empfangen und d a r a u f r e a g i e r e n
24 i m p o r t j a v a . u t i l . O b s e r v e r ;
25 i m p o r t j a v a . u t i l . O b s e r v a b l e ;
26 c l a s s B e o b a c h t e r i m p l e m e n t s O b s e r v e r {
27 p u b l i c void update ( Observable o , Object s t r ) {
28 System . o u t . p r i n t l n ( ” u p d a t e : ” + s t r . t o S t r i n g ( ) ) ;
29 }
30 }

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Idiom in der Softwaretechnik

Idiom

Ein Idiom ist ein programmiersprachenspezifisches Muster und damit ein


Muster auf einer niedrigen Abstraktionsebene. Ein Idiom beschreibt, wie
man bestimmte Aspekte von Komponenten oder Beziehungen zwischen
ihnen mit den Mitteln einer bestimmten Programmiersprache
implementiert.

Eigenschaften
programmiersprachenspezifisch
zu finden im Feinentwurf und Implementierung (niedrige
Abstraktionsebene). Es geht also dabei um die Implementierung von
speziellen Entwurfsaspekten.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Idiom in der Softwaretechnik

Idiom

Anwendung
Konkrete Implementierung eines Entwurfsmusters
Programmierkonventionen: Grundgedanke ”The code is not yours”, z.
B. Codeformatierung, Namenskonventionen, Kommentar
Formatierung, usw. Dies kann mit oder auch ohne technische
Unterstützung (CheckStyle/Pretty Printer) geschehen
Typische Code-Strukturen, z. B. minimale Klassenschnittstelle
Typische Lösungsansätze für die durch die Programmiersprache nicht
direkt unterstützten Probleme, z. B. Speicherverwaltung

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Design Patterns - Grundlagen Anti Patterns Smalltalk Katalog der Patterns Creational Patterns Structural Patterns Behavioral Patterns Idiom Java - Allge

Links etc.

Handbuch der Javaprogrammierung - www.javabuch.de


Thinking in Java - www.mindview.net/Books/TIJ/
Interaktives Java-Buch -
www.gailer-net.de/tutorials/java/java-toc.html
Java ist auch eine Insel -
www.galileocomputing.de/openbook/javainsel5/
Programmierhandbuch für die Java-Standard-Edition -
www.dpunkt.de/java/index.html
Java - Programmieren in Beispielen - noebis.pi-noe.ac.at/javanuss/
index.html
Das offizielle Java-Tutorial von Sun -
java.sun.com/docs/books/tutorial/index.html

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering
Literaturverzeichnis

Gamma, Erich, Helm Richard Johnson Ralph


Vlissides John: Design Patterns Elements of Reusable
Object-Oriented Software.
Addison Wesley, Massachusetts, 6. Auflage, 1996.

Dr. Bernhard Pfeifer Grundlagen der Programmierung WS 06/07 UMIT Institute for Biomedical Engineering