Entwurfsmuster - · PDF fileDesign-Patterns und Frameworks, ... (JAVA) – für...

Preview:

Citation preview

1iTec

Entwurfsmuster

2iTec

q Einführung: was ist und wozu braucht man Patterns u. Frameworks ?

q wie werden Patterns beschrieben ?

q Beispiele für Designpatterns– Singleton– Proxy– State– Beobachter/Observer– Adapter– Kompositum– Dekorierer– Abstrakte Fabrik

Inhalt 11. Patterns und Frameworks

3iTec

q Software-Entwicklung ist mühsam

q wiederverwendbare Software zu schreiben, ist noch mühsamer

q Hilfe bei dieser Mühe: Design-Patterns und Frameworks, die für häufig wiederkehrende Probleme bewährte Lösungsmuster anbieten

Einführung 11. Patterns und Frameworks

was ist und wozu braucht man Patterns und Frameworks?

4iTec

q Christopher Alexander (1977): A Pattern Language

wie können Standardlösungen immer wiederkehrender Innenarchitekturprobleme sprachlich formuliert werden?

q Erich Gamma, R.Helm, R. Johnson, J. Vlissides (1995): Design Patterns – Elements of reusable OO-Software

legten einen bis heute massgebenden Katalog von 23 Patterns vor

q heute: es gibt kaum OO-Entwicklungen ohne Patterns ! es gehört zum Grundvokabular eines jeden SW-Ingenieurs !

Einführung 11. Patterns und Frameworks

Geschichte der Patterns

5iTec

zunächst einige wichtige Begriffe

Software DesignDie Aktivitäten, die aus den Anforderungen an ein Softwaresystem eine Softwarelösung entwerfen.Diese Lösung beschreibt die Systemstruktur als Systemarchitektur (siehe nächste Folie) und dient der Implementation des Systems als Blueprint. .

q der Design enthält nicht die Implementation des Systems

q der Design enthält die eigentliche Lösung eines Problems

q der Design wird methodisch und mit Diagrammtechniken erarbeitet

Einführung 11. Patterns und Frameworks

6iTec

wichtige Begriffe

Software-Architektur eine Beschreibung der Teilsysteme und Komponenten eines Softwaresystems und deren Beziehungen untereinander. Teilsysteme und Komponenten werden unter verschiedenen Blickwinkeln betrachtet, um verschiedene funktionale und nichtfunktionale Aspekte zu beschreiben.Eine Softwarearchitektur ist das Resultat des Software-Designs.

Einführung 11. Patterns und Frameworks

q Komponenten sind gekapselte, mit Schnittstellen versehene Systemteile: Module, Bibliotheken, Klassen/Objekte

q nichtfunktionale Aspekte: z.B. Erweiterbarkeit, Zuverlässigkeit,Kosten, Wartbarkeit, Portierbarkeit

q Beziehungen: zB. statisch, dynamisch, abhängig, enthalten, abgeleitet

7iTec

wichtige Begriffe

FrameworkEin teilweise vorgefertigtes Softwaresystem das noch "instanziiert" werden muss durch Einfügen fehlender Teile. Dabei wird eine Architektur vordefiniert, in der wesentliche Komponenten vorgefertigt sind, und diejenigen Stellen werden genau definiert, in denen das Framework mit Implementationen für ein spezielles System noch instanziiert werden muss/kann..

q Frameworks sind die grösstmöglich vorgefertigten Systemrohbauten

q Frameworks sind meist typisch für ganze Anwendungsbereiche, zB.:

– für interaktive Systeme mit GUIs – MFC (C++), JFC (JAVA)

– für verteilte OO-Systeme – CORBA, DCOM

Einführung 11. Patterns und Frameworks

8iTec

q IdiomProgrammiermuster – wie in einer bestimmten Programmiersprache kleine Programmierprobleme gelöst werden. Beispiel in C/C++: wie man ein Feld durchläuft

q Spezifischer Designein spezifischer, persönlicher Design für ein bestimmtes Problem. Kann schlau sein, aber versucht nicht, allgemein anwendbar zu sein

q Standard Designein Design für ein bestimmtes Problem, der Allgemeinheit erlangt hat durch Wiederverwendung. Z.B. eine unternehmensweite Lösung für das Y2000-Problem

q Design Patterneine Lösung für eine ganze Klasse von ähnlichen Problemen. Meistens erst sichtbar nach längerer Anwendung von Standard-Designs.

Einführung 11. Patterns und Frameworks

Pattern Einordnung

9iTec

q lerne RegelnFigurenamen und –zugmöglichkeiten, Schachbrettgeometrie etc.

q lerne Prinzipienrelativer Figurenwert, strategischer Wert des Brettzentrums, Angriffsvermögen etc.

q schliesslich und vor allem: lerne von Spielen der MeisterSpielzüge und deren Anwendungssituationen: Muster (Patterns) es gibt hunderte von solchen Spielzügen/Strategien

wie wird man ein guter Schachspieler?

Einführung 11. Patterns und Frameworks

10iTec

q lerne RegelnAlgorithmen, Datenstrukturen, Programmiersprachen

q lerne Prinzipienmodulares Programmieren, objektorientiertes Programmieren

q schliesslich und vor allem: lerne von SW-Designs der "Meister"Muster (Patterns) von allgemeinen Lösungen immer wiederkehrender Designprobleme

wie wird man ein guter Software-Designer?

Einführung 11. Patterns und Frameworks

11iTec

q Absichtstellt sicher, daß von einer Klasse höchstens ein Objekt erzeugtwird, und stellt einen globalen Zugriff auf das Objekt bereit

q Motivationin manchen Anwendungen dürfen einige Klassen nur eine Objektinstanz besitzen – z.B. ein Printer-Spooler Objekt, ein Firma Objekt, ein Windows Manager Objekt, ein Roboter Objekt mit Konfigurationsdaten zur Robotersteuerung, ein DB-Broker.

Objekt in globaler Variablen keine Garantie für Einmaligkeit

besser:

lasse die Klasse selber ihren Konstruktor überwachen

Pattern Beispiel: Singleton

Einführung 11. Patterns und Frameworks

12iTec

Einführung 11. Patterns und Frameworks

Beispiel: Singleton

q Idee

– verberge alle Konstruktoren nach aussen: mache sie private

– biete eine neue Methode "instance" nach aussen an, die eine Referenz auf (das einzige) Objekt zurückgibt

– diese Methode muss eine Klassenoperation sein (static)! warum?

13iTec

Beispiel: Singleton

Einführung 11. Patterns und Frameworks

class Singleton {private static Singleton s = new Singleton();

private Singleton() { . . }

public static Singleton Instance() { return s; }. . . //Attribute und Methoden

}

das Klassenattribut s hälteine Referenz auf das einzigeObjekt der Klasse Singleton

das Klassenattribut s hälteine Referenz auf das einzigeObjekt der Klasse Singleton

mindestens einen Konstruktordefinieren als private: kein (öffentlicher) Default-Konstruktor mehr verfügbar

mindestens einen Konstruktordefinieren als private: kein (öffentlicher) Default-Konstruktor mehr verfügbar

einzige öffentliche Zugriffs-methode auf ein Singleton-Objekt: ist Klassenmethode

einzige öffentliche Zugriffs-methode auf ein Singleton-Objekt: ist Klassenmethode

Singleton s = Singleton.Instance();Benutzung: s referenziert das

einzige Singleton-ObjektBenutzung: s referenziert das

einzige Singleton-Objekt

14iTec

Beispiel: Singleton (JAVA)

Einführung 11. Patterns und Frameworks

class Singleton {

private static Singleton s =

new Singleton(99);

private int i;

private Singleton(int x) { i = x; }

public static Singleton Instance() {

return s;

}

public int getValue() { return i; }

public void setValue(int x) { i = x; }

}

public class SingletonPattern {

public static void main(String[] args) {

Singleton s = Singleton.Instance();

System.out.println(s.getValue());

Singleton s2 = Singleton.Instance();

s2.setValue(9);

System.out.println(s.getValue());

}

}

Ausgabe: 999

15iTec

1. Erzeugungsmuster (creational pattern)beschreiben Strukturen, die den Prozeß der Objekterzeugung enthalten. Das Anwendungsprogramm wird von der konkreten Realisation der Objekterzeugung entkoppelt. Es arbeitet auf einer höheren Abstraktionsebene und delegiert die Erzeugung der Objekte an die Erzeugungsstrukturen

2. Strukturmuster (structural pattern)zeigen auf, auf welche Art und Weise Klassen bzw. Objekte zu größeren Strukturen zusammengefaßt werden können. Nahezu alle der vonStrukturmustern beschriebenen Strukturen entstehen zur Laufzeit, beruhen also auf der Technik derdynamischen Objektkomposition

Einführung 11. Patterns und Frameworks

es gibt drei Pattern Typen

16iTec

3. Verhaltensmuster (behavioral patterns)beschreiben Strukturen, die am Kontrollfluß innerhalb der Anwendung beteiligt sind. Sie konzentrieren sich also auf Algorithmen und die Delegation von Zuständigkeiten.

Einführung 11. Patterns und Frameworks

es gibt drei Pattern Typen

17iTec

Einführung 11. Patterns und Frameworks

18iTec

q Entwickler lernen schnell besseres Design

q Entwickler werden produktiver

q Qualität der Software wird besser

q Kommunikation zwischen Entwicklern wird besser

q Kommunikation bei der Wartung wird besser

Einführung 11. Patterns und Frameworks

Vorteile von Entwurfsmustern

19iTec

q Nameden wir als Kürzel für das Muster benutzen können, wenn wir uns darüber unterhalten.

q Absicht kurze (1 – 2 Sätze) Beschreibung des Ziels des Patterns

q Problembeschreibt die typische Situation, die eine neue Lösung erfordert. Oft wird hier ein ganz konkretes Problem beschrieben, anhand dessen das einzuführende Muster ausprobiert werden kann.

q Lösungsideeskizziert, wie das Muster aussehen könnte, mit dem das im vorigen Abschnitt beschriebene Problem gelöst werden könnte.

q Strukturwird in einem UML Diagramm angegeben, das die statische Struktur der beteiligten Klassen verdeutlicht.

q Die BeteiligtenHier werden die beteiligten Klassen noch einmal in Worten aufgezählt und ihre Rollen ausführlicher beschrieben.

Patternbeschreibung 11. Patterns und Frameworks

20iTec

q Zusammenspiel erklärt die Kooperation zwischen den beteiligten Klassen. Dieser Abschnitt enthält oft auch ein (UML) Diagramm, in dem der Austausch von Nachrichten zwischen Objekten verdeutlicht wird.

q Anwendbarkeit beschreibt Situationen, in denen das Muster sinnvoll eingesetzt werden kann, bzw. die Bedingungen, die gelten müssen, damit es eingesetzt werden kann.

q Folgenbeschreibt die Vor- und Nachteile, die dieses Muster mit sich bringt.

q Implementation diskutiert Aspekte, die bei Implementation des Musters zu bedenken sind

q Codebeispielegibt konkrete Implementationen des Musters an anhand eines typischen Problems, in den wichtigsten OO-Sprachen (JAVA, C++)

q Bekannte Anwendungen (bekannt!)q Verwandte Muster

geht auf Beziehungen zwischen diversen Mustern ein; es ist selten so, daß eine Problemklasse nur durch ein einziges Muster allein entschärft wird.

Patternbeschreibung 11. Patterns und Frameworks

21iTec

q Name Proxyq Absicht

stelle ein Stellvertreter/Platzhalter für ein Objekt zur Verfügung, um über dieses Platzhalter-Objekt Zugriff auf das ursprüngliche Objekt zu garantieren

q Problem manchmal ist die Erzeugung und Initialisierung eines Objektes aufwendig – grosse Datenmenge (z.B. Bilddaten), oder "entlegener" Ort wo das Objekt gespeichert ist (Netz, verteilte DB), oder grosse Anzahl von Objekten bei Initialisierung einer komplexen Anwendung

q Lösungsidee verschiebe die Objektinitialisierung bis zum eigentlichen Gebrauch seitens des Verwenders (Klient), und stelle ihm solange nur ein Stellvertreterobjekt zur Verfügung (Schnittstelle mit den Operationen des eigentlichen Objekts). Der Klient soll den Proxy so sehen als ob er das richtige Objekt wäre.

Proxy 11. Patterns und Frameworks

22iTec

Proxy 11. Patterns und Frameworks

Struktur

KlientSubjekt{abstract}

operation(). . . ()

operation() {vertritt.operation();

}

EchtesSubjektoperation(). . . ()

Proxyoperation(). . . ()

vertritt

einKlient:einProxy: einEchtesSubjekt:

Klassendiagramm

Objektdiagrammoperation() operation()

23iTec

q Rollen

Klient: greift auf ein Subjekt über ein Proxy zu, so als ob es ein EchtesSubjekt wäre. Er ist aber nur mit dem Proxy direkt verbunden (Referenz, Zeiger)

Subjekt: stellt die gemeinsame Schnittstelle dar, sodass Proxy überall dort verwendet werden kann, wo eine EchtesSubjekt gebraucht wird. Hält meistens nur die Operationen (alle Attribute von EchtesSubjekt geschützt). Insbesondere stellt Subjekt sicher, dass Proxy und EchtesSubjekt gleich aussehen

Proxy: ist der Ansprechpartner für Nachrichten eines Klients. Hält eine Referenz/Zeiger auf das EchteSubjekt, und ist verantwortlich für die Erzeugung (und evtl. Zerstörung) von EchtesSubjekt.

EchtesSubjekt: enthält die Daten und den Programmcode

Proxy 11. Patterns und Frameworks

24iTec

Rollen (Fortsetzung)

es gibt mehrere Typen von Proxy:

q Remote-ProxyEchtesSubjekt (Objekte) befindet sich in einem anderen Adressraum (anderer Prozess, oder woanders im Netzwerk). Ein Remote -Proxy kodiert und schickt einen Request an EchtesSubjekt

q Virtuelles Proxyerzeugt ein umfangreiches Objekt im gleichen Adressraum "auf Anfrage"

q Schutz-Proxykontrolliert den (geschützten) Zugriff auf EchtesSubjekt, z.B. über Zugriffsrechte

Proxy 11. Patterns und Frameworks

25iTec

q ein Remote-Proxy kann einem Klient verbergen, dass das ange-sprochene Objekt (EchtesSubjekt) in anderem Adressraum liegt

q ein Virtuelles Proxy kann optimieren: – verzögerte Objektinitialisierung (vielleicht nie) – Lastausgleich bei initialisierungsintensiven Anwendungen

q ein virtuelles Proxy kann selber einfache Daten halten

Proxy 11. Patterns und Frameworks

Folgen

26iTec

Proxy 11. Patterns und Frameworks

27iTec

interface Subjekt {int getA();float getB();

}

class Proxy implements Subjekt {private EchtesSubjekt vertritt;

// delegiere Methodenaufrufe an EchtesS:

public int getA() {

return getEchtesSubjekt().getA(); }

public float getB() {

return getEchtesSubjekt().getB(); }

protected EchtesSubjekt getEchtesSubjekt() {if ( vertritt == null )

vertritt = new EchtesSubjekt();return vertritt;

}}

Proxy 11. Patterns und Frameworks

class EchtesSubjekt implements Subjekt {protected int a;protected int b;public int getA() {

System.out.println("EchtesSub.getA()"); return a; }

public float getB() { System.out.println(" EchtesSub.getB()"); return b; }

public EchtesSubjekt() {a=1; b=1;}}

public class Klient {public static void main(String args[]) {

Proxy p = new Proxy();System.out.println(" a: " + p.getA() );System.out.println(" b: " + p.getB() );

}}

Beispiel in Java: virtueller Proxy

lazy initializationlazy initialization

28iTec

q Name Zustand/State

q Absichtlass ein Objekt sein Verhalten ändern (Ausführung einer Operation) wenn sein interner Zustand sich ändert

q Problem ein Objekt hat interne Zustände (Attributwerte), die einige seiner Operationen beeinflussen. z.B. Datei öffnen:

Zustand/State 11. Patterns und Frameworks

Dateidateiname : Stringoeffnen()schliessen()weitereOp()

OffeneDateioeffnen()schliessen()

GeschlosseneDateioeffnen()schliessen()

Dateidateiname : Stringoffen : booleanoeffnen()schliessen()weitereOp()

Spezialisierung

Problem: ein Dateiobjekt müsste seine Klasse wechseln können

29iTec

q Lösungsideelagere den zustandsabhängigen Teil aus der Klasse aus (eigene Klasse), implementiere in der Klasse nur den zustandsunabhängigen Teil, und delegiere zustandsabhängige Operationen an die ausgelagerte Klasse

q Struktur

Zustand/State 11. Patterns und Frameworks

1KlasseMitZustand

opAbhängig()opUnabhängig()

Zustand{abstract}

opAbhängig()

ZustandA

opAbhängig()

ZustandB

opAbhängig(). . .

operation() {state.opAbhängig();

}

state

Zustandsänderung: - wie wird er geändert ?- wer bzw. wo wird ein Zustand geändert ?

30iTec

q KlasseMitZustanddie eigentliche Klasse, die nur den zustandsunabhängigen Teil enthält (evtl. mit Operationen die den Zustand verändern). Sie hält eine Referenz auf den aktuellen Zustand, über die zustandsabhängige Operationen delegiert werden.

q Zustandabstrakte Schnittstelle (Polymorphismus) für die delegierten, zustandsabhängigen Operationen

q konkreter Zustand (ZustandA, ZustandB) implementieren die zustandsabhängigen Operationen

Zustandsänderungen: ersetze aktuell referenziertes Zustandsobjekt durch ein neues

Zustand/State 11. Patterns und Frameworks

Rollen

31iTec

1. wenn ein Objekt Operationen hat, deren Logik von einem Zustand des Objektes selber abhängt der sich zur Laufzeit ändern kann

2. das Objekt wenig Zustände hat und die Zustandsübergänge selber einen einfache Zustandsübergangsgraphen besitzen

3. falls 2 nicht erfüllt ist, empfiehlt sich eine Realisierung mit einem endlichen Zustandsautomat

Zustand/State 11. Patterns und Frameworks

Anwendbarkeit:

32iTec

Zustand/State 11. Patterns und Frameworks

wenn man komplexe Zustandsübergänge hat, benutzt man vorzugsweiseeinen endlichen Zustandsautomaten:

Zustandz_i

Zustandz_j

Ereignis e_k/

Aktion a_m

( z_j ,a_m )

(folge-zustand, aktion)

ZustandEreignisz_1 z_2 . . . z_i . . .

e_1

e_2

. . .

e_k. . .

im Zustand z_j führt das Ereignis e_k zumFolgezustand z_j undlöst Akton a_m aus

im Zustand z_j führt das Ereignis e_k zumFolgezustand z_j undlöst Akton a_m aus Darstellung in einer

Tabelle von Paaren:(folgezustand,aktion)

Darstellung in einerTabelle von Paaren:(folgezustand,aktion)

33iTec

ComplexClass

...actState : Stateact : Action;...

StateTransitionTable

stTable //state table

create(ComplexClass cp) //loads tablesave()addState( State st )addEvent( Event ev )addTransition(State st1, State st2,

Event ev, Action act)removeState(...) ...State transit( State st, Event ev,

Action &act)

event1(..) {//operation op1 implements event 1

actState = hasSTT.transit(actState, E1, act );

switch (act) {case A1: action1(..); //execute action

break;case A2: action2(..);

. . .} event2(..) ...action1(..) //action A1action2(..) //action A2. . .

hasSTT

1..* 1

Zustand/State 11. Patterns und Frameworks

34iTec

q es strukturiert das Objektverhalten nach Zuständen: – jede Zustandsklasse enthält die Zustandsbesonderheiten – leichter les- und vor allem wartbar

q unterstützt Zustandsklassifizierung: Zustände sind manchmal klassifizierbar durch Super-/Subklassenbeziehungen

q Zustände werden explizit gemacht

Zustand/State 11. Patterns und Frameworks

Konsequenzen

35iTec

q Name: Beobachter (Observer)

q AbsichtObjekte können Daten bei einem Informationsanbieterabonnieren. Bei jeder Änderung der abonnierten Daten werden die Abonnenten automatisch über die Änderung informiert, die sich dann die geänderten Daten holen.

q Problem voneinander abhängige Objekte sollen nicht zu stark aneinander gekoppelt werden, was Wiederverwendbarkeit einschränken würde.

q Lösungsidee Trennung von Informationsbereitsteller und einer Menge vonInformationsverarbeitern bzw. Darstellern der Information. Die Bereitsteller müssen die Verarbeiter nicht direkt kennen: statt direkter Kommunikation über Aufrufe benutze eine indirekte über Benachrichtigungen.

Beobachter/Observer 11. Patterns und Frameworks

36iTec

Subjekt{abstract}

#benachrichtigen()+registrieren(beob:Beobachter)+löschen(beob:Beobachter)

Beobachter{abstract}

+aktualisieren(. . . )

1..* ? beobachtet*

MeinSubjekt

+getMeineDaten(): Data+setMeineDaten(d:Data). . .

-meineDaten : DataClient

setMeineDaten(x)

MeinBeobachter

+aktualisieren(. . . )

- zustand

- beobachtet : Subjekt

beobachtet.getMeineDaten();. . . //aktualisiere zustand

. // bearbeite und

. // aktualisiere

. // meineDatenbenachrichtigen();

beobachtetVon ?

- beobachtetVon : ListOfBeobachter

für alle beo in beobachtetVon:beo.aktualisieren(. . . );

Struktur

Beobachter/Observer 11. Patterns und Frameworks

37iTec

Teilnehmerq Subjekt

kennt seine Beobachter (beliebig viele) als abstrakte Beobachter; bietet Schnittstelle zur (Ent)Registrierung von Beobachtern; hat Operation zur Benachrichtigung registrierter Beobachter

q Beobachterbietet einen Typ (abstrakte Klasse/Interface) der benachrichtigtwerden kann von Subjekten

q MeinSubjektwird unabhängig von Beobachtern programmiert: hält aber Daten von denen Beobachter-Objekte abhängig sind; sendet (fast automatisch) Benachrichtigungen an Beobachter-Objekte wenn Daten sich ändern

q MeinBeobachter ist abhängig und hält eine Referenz zu einem MeinSubjekt-Objekt; enthält Daten die mit Daten des Subjekts konsistent sein müssen;implementiert die aktualisiere-Operation zur Benachrichtigung

Beobachter/Observer 11. Patterns und Frameworks

38iTec

Beobachter/Observer 11. Patterns und Frameworks

Zusammenspielq jedes Objekt der Klasse Subjekt führt eine Liste von Beobachtern, welche

an Veränderungen im Zustand dieses Objekts interessiert sind. registrierenbzw. loeschen fügt Beobachter in die Liste ein bzw. entfernt sie.

q nach jeder Veränderung schickt das Subjekt sich selbst die Nachricht benachrichtigen. Diese iteriert die Liste der Beobachter und schickt jedem Beobachter die Nachricht aktualisieren. Ggf. können Informationen (z. B. die Art des eingetretenen Ereignisses, oder das benachrichtigende Objekt selber) als Parameter mitgegeben werden.

q jeder benachrichtigte Beobachter reagiert, indem er beim benach-richtigenden Sujekt mit getXXX- Nachrichten die ihn interessierenden Informationen abruft.

q alternativ können der aktualisiere-Nachricht die veränderten Daten gleichmitgegeben werden, wodurch der Abruf durch getXXX entfällt. Dieses"Bring"-Prinzip ist effizient, koppelt aber Subjekt und Beobachter stärker als das mit getXXX realisierte "Hol"-Prinzip.

39iTec

Beobachter/Observer 11. Patterns und Frameworks

ms :MeinSubjekt

Zusammenspiel

mb :MeinBeobachter

registrierenmb

setMeineDaten

benachrichtigen

aktualisieren

db :DeinBeobachter

aktualisieren

getMeineDatenData

dbregistrieren

getMeineDatenData

40iTec

q wenn eine Änderung in einem Objekt Änderungen in anderen verlangt, und das erstere weiss zur Programmierzeit oder zum Systemstart nicht, welche anderen von ihm abhängen

q wenn man also dynamische Abhängigkeiten hat

q wenn man Abhängigkeiten in reinen Client/Server-Beziehungen modellieren möchte zwecks leichterer Änderbarkeit

Anwendbarkeit

Beobachter/Observer 11. Patterns und Frameworks

Clientklasse Serverklasse

weiss von

weiss nichts von

41iTec

q schwache, einseitige Kopplung zwischen unabhängiger und abhängigen Klassen: erstere kennt nur eine abstrakte Schnittstelle zur Benachrichtigung

q sauberer Design: Aktualisierungslogik im abhängigen Teil, nicht im bestimmenden (nur benachrichtigen, nicht aktualisieren)

q dadurch können die beiden Klassentypen zu unterschiedlichen Systemebenen gehören (nächste Folie)

q unterstützt eine Art Broadcasting

Beobachter/Observer 11. Patterns und Frameworks

Folgen

42iTec

Beobachter/Observer 11. Patterns und Frameworks

bekannte Anwendungenvon Präsentationsschicht unabhängige Anwendungslogik

GUI-Kom-ponente1

GUI-Kom-ponente2

GUI-Kom-ponente3

Präsentationsschicht

Klasse1 Klasse2

Anwendungslogikschicht

Abhängigkeit

GUI-Komponenten repräsentierenDaten der Anwendungslogikschicht

GUI-Komponenten repräsentierenDaten der Anwendungslogikschicht

Klassen der Anwendungslogikschichtverarbeiten Daten, ohne sie am Bild-schirm zu präsentieren

Klassen der Anwendungslogikschichtverarbeiten Daten, ohne sie am Bild-schirm zu präsentieren

43iTec

q wann soll die Registrierung (Löschen) geschehen?meistens im Konstruktor (Destruktor) eines Beobachters

q mehrere Subjekte: wie erkennen, welches Subjekt benachrichtigt?Parameter des Subjektes (this) bei Benachrichtigung übergeben

q muss immer gleich aktualisiert werden?nein, man kann eine lazy-computing Technik einsetzen

Beobachter/Observer 11. Patterns und Frameworks

Implementation

44iTec

MeinBeobachter

-meinAttribut: Typ //abhängiges Attr.-meinAttributStatus //valid/invalid

+benachrichtige() +getMeinAttribut(): Typ

Typ getMeinAttribut() {if (meinAttributStatus == invalid){

beobachtet.getMeineDaten();. . . //Neuberechnung von meinAttribut

meinAttributStatus = valid; }return meinAttribut; }

Beobachter/Observer 11. Patterns und Frameworks

void benachrichtige() {

meinAttributStatus = invalid;}

Client

getMeinAttribut()

lazy computing: erst dann berechnen, wenn Daten gebraucht werden

Vorteil:weniger Berechnungen, falls Subjekt wesentlich öfter benachrichtigt alsBeobachter befragt wird

45iTec

Beobachter/Observer 4. Patterns und Frameworkspublic abstract class Subje kt {

private Beobachter[] beobachtetVon = new Beobachter[MAXB];

private int anzBeobachter = 0;

public void registrieren( Beobachter beob ) {beobachtetVon[ anzBeobachter++] = beob;

}

public void löschen( Beobachter beob ) {for ( int i = 0; i < anzBeobachter; ++i ) {

if (beobachtetVon[i] == beob) {- - observerCnt;for ( ; i < anzBeobachter; ++i)

beobachtetVon[ i ] = beobachtetVon[ i + 1 ]; break;

}}

}

public void benachrichtigen() {for (int i = 0; i < anzBeobachter; ++i)

beobachtetVon[i].aktualisieren( this );}

}

public class MeinSubjekt extends Subjekt {

private int wert;

public MeinSubjekt( int wert ) {this.wert = wert;

}

public void setWert( int wert ){

this.wert = wert;benachrichtigen();

}

public int getWert() {return wert;

} }

46iTec

public class Anwendung {public static void main( String[] args )

MeinSubjekt sub = new MeinSubjekt( 99 );

MeinBeobachter beo = new MeinBeobachter( sub );

System.out.println( "abhgWert: " +beo.getAbhgWert() );

}}

sub.setWert( 2 );

Beobachter/Observer 11. Patterns und Frameworks

interface Beobachter {public void aktualisieren( Subje kt subjekt );

}

public class MeinBeobachter implements Beobachter {

int abhgWert; //abhängiger Wert

public MeinBeobachter( Subjekt subjekt ) {abhgWert = subjekt.getWert() / 2;subjekt.registrieren( this );

}

public void aktualisieren( Subjekt subjekt ) {abhgWert = subjekt.getWert() / 2; //zum Beispiel

}

public int getAbhgWert() { return abhgWert;

}}

hier wird im Hintergrund der abhängige Wert von MeinBeobachter aktualisiert.Ausgabe: abhgWert: 1

hier wird im Hintergrund der abhängige Wert von MeinBeobachter aktualisiert.Ausgabe: abhgWert: 1

47iTec

Adapter 11. Patterns und Frameworks

q Name: Adapter

q Absichterlaubt die Zusammenarbeit von Klassen die unterschiedliche Schnitt-stellen haben. Adapter wird als verbindendes Element zwischen die beiden Klassen eingefügt.

q ProblemSchnittstellenproblem: eine Klasse "Verwender" (Klient) soll eine andere Klasse "Dienstanbieter" (Ziel) verwenden. Der Verwender kann jedochauf den Dienstanbieter nicht zugreifen, da der Verwender eine andere Schnittstelle erwartet als die, die vom Dienstanbieter angeboten wird.

q LösungsideeDer Dienstanbieter wird in einen Adapter eingepackt. Der Adapterbietet die Schnittstelle an, die der Verwender benötigt.

Dazu gibt es zwei Varianten:• Objektadapter• Klassenadapter

Adapter

48iTec

Adapter 11. Patterns und Frameworks

Struktur: Objektadapter

Adaption:q andere Operationensignatur – Operations- und Parameternamen,

Parametertypen und -reihenfolge q andere Operationsfunktionen – ähnliche, aber nicht genau gleiche

Semantik

Klient Zieloperation()

AdaptierteKlassespezifischeOperation()

Adapteroperation()

operation(). . .

adaptiert.spezifischeOperation(). . .

adaptiertbenutzt

49iTec

Adapter 11. Patterns und Frameworks

GraphischesObjekt{abstract}

begrenzungsRahmen()zeichne()

Linie

begrenzungsRahmen()zeichne()

Zeicheneditor 1 manipuliert *

Kreis

begrenzungsRahmen()zeichne()

zeichne()begrenzungsrahmen()

TextAnzeige

getUrsprung()getHoehe()getBreite()zeigMich()

Adapter Beispiel: ein Zeicheneditor mit fremder Komponente TextAnzeige

TextAnzeige passt nicht zu GraphischesObjekt: Problem für den Zeicheneditor

50iTec

Adapter 11. Patterns und Frameworks

GraphischesObjekt{abstract}

begrenzungsrahmen()zeichne()

Linie

begrenzungsrahmen()zeichne()

Zeicheneditor 1 manipuliert *

Kreis

begrenzungsrahmen()zeichne()

zeichne()begrenzungsrahmen()

TextAnzeige

getUrsprung()getHoehe()getBreite()zeigMich()

Adapter Beispiel: ein Zeicheneditor mit fremder Komponente TextAnzeige

Text

begrenzungsrahmen()zeichne()

1text

1

begrenzungsrahmen()

text.getHoehe()text.getBreite()

. . .

zeichne(). . .

text.zeigMich(). . .

einseitige Beziehung: TextAnzeige auch ohne Quellcode verwendbar

einseitige Beziehung: TextAnzeige auch ohne Quellcode verwendbar

51iTec

Adapter 11. Patterns und Frameworks

Struktur: Klassenadapter

Klient Zieloperation()

AdaptierteKlassespezifischeOperation()

Adapteroperation()

operation(). . .

spezifischeOperation(). . .benutzt Mehrfachvererbung

52iTec

q Klassenadapterbenutzt nur eine Objekt, während Objektadapter aus zwei bestehen

q Objektadapterkann auch Objekte von Unterklassen der adaptierten Klasseadaptieren, was der Klassenadapter nicht kann

Adapter 11. Patterns und Frameworks

Folgen

53iTec

Adapter 11. Patterns und Frameworks

Implementation in JAVA: Objektadapter mit einem Interfaceclass WasIchHabe {public void g() {}public void h() {}

}

interface WasIchMoechte {void f();

}

class WasIchBenutze {public void op(WasIchMoechte wim) {

wim.f();}

}

class Adapter implements WasIchMoechte {//Referenz auf was adaptiert werden soll

private WasIchHabe wasichhabe;//Konstruktor verbindet Adapter mit WasIchHabe

public Adapter(WasIchHabe wih) {wasichhabe = wih;

}public void f() {

// Implementiert Methode mit den// Methoden in WasIchHabe:

wasichhabe.g();wasichhabe.h();

}}

WasIchBenutze WasIchMoechte WasIchHabe

Adapter

54iTec

Kompositum 11. Patterns und Frameworks

Zweck

Füge Objekte zu Baumstrukturen zusammen, um Teil-Ganzes-Hierarchien zu repräsentieren.

Das Kompositionsmuster ermöglicht es dem Klienten (Benutzer dieses Musters), sowohl einzelne Objekte als auch Kompositionen von Objekten einheitlich zu behandeln.

Motivation

viel verwendet in Grafik-Anwendungen und im Produktionsbereich (Produktbäume)

55iTec

Grafik

zeichne()hinzufügen(Grafik)entfernen(Grafik)holeNächstesKind()

Linie

zeichne()

Bild

zeichne() //Delegation!!hinzufügen(Grafik g)entfernen(Grafik)holeNächstesKind()

*

{abstract}

Kompositum 11. Patterns und Frameworks

Beispiel:Grafikanwendung

enthält

Rechteck

zeichne()

Text

zeichne()

für alle g in "enthält":g.zeichne();

für alle g in "enthält":g.zeichne();

füge g ein in"enthält"füge g ein in"enthält"

56iTec

Kompositum 11. Patterns und Frameworks

57iTec

Kompositum 11. Patterns und Frameworks

Komponente • Deklariert die Schnittstelle für Objekte in der zusammengefügten Struktur. • Implementiert, sofern angebracht, ein Defaultverhalten für die allen Klassen gemeinsame

Schnittstelle (ist in JAVA dann abstrakte Klasse). • Deklariert eine Schnittstelle zum Zugriff auf und zur Verwaltung von Kindobjekten. • Definiert optional eine Schnittstelle zum Zugriff auf das Elternobjekt einer Komponente

innerhalb der rekursiven Struktur und implementiert sie, falls dies angebracht erscheint.

Blatt • Repräsentiert Blattobjekte in der Komposition. Ein Blatt besitzt keine Kindobjekte. • Definiert Verhalten für die primitiven Objekte in der Komposition.

Kompositum • Definiert Verhalten für Komponenten, die Kindobjekte haben können. • Speichert Kindobjektkomponenten. • Implementiert kindobjekt-bezogene Operationen der Schnittstelle von Komponente.

Klient • Manipuliert die Objekte in der Komposition durch die Schnittstelle von Komponente.

Rollen

58iTec

Kompositum 11. Patterns und Frameworks

Verwende das Kompositionsmuster, wenn

• Teil-Ganzes-Hierarchien von Objekten repräsentiert werden sollen

• KKKlienten in der Lage sein sollen, die Unterschiede zwischen zusammengesetzten und einzelnen Objekten zu ignorieren. Klienten behandeln alle Objekte in der zusammengesetzten Struktur einheitlich.

Verwendung

59iTec

q gewünscht: eine Klasse eines binären Suchbaums, dessen Objekte auch leer sein können: Binärbaum ohne Elemente

q Anforderung: der leere Baum muss genauso ansprechbar sein wie ein nichtleerer binärer Suchbaum: also mit Operationen– isEmpty(), isIn(Object o), insert(Object o)

q ein leerer Baum kann also nicht als Nullreferenz realisiert werden !

ein binärer Suchbaum: Entwurf als Kompositum und mit leerem Baum als Singleton

Singleton/Kompositum 11. Patterns und Frameworks

Beispiel

60iTec

Singleton/Kompositum 11. Patterns und Frameworks

«Interface»BinSearchTree

isEmpty(): booleanisIn(Object o): booleaninsert(Object o): BinSearchTree

«Singleton»EmptyTree

empty: EmptyTree

isEmpty(): booleanisIn(Object o): booleaninsert(Object o): BinSearchTree

Node

info: ObjectleftChild: BinSearchTreerightChild: BinSearchTree

isEmpty(): booleanisIn(Object o): booleaninsert(Object o): BinSearchTree

hasFatherhasChild 0..2

0..1

ein binärer Suchbaum: Entwurf als Kompositumund mit leerem Baum als Singleton

61iTec

empty:EmptyTree:ClientClass

Instance()

insert(o1)

b:Node

b = EmptyTree.Instance()

new(o1)b = b.insert(o1)

b = b.insert(o2)insert(o2)

b.leftChild:Nodenew(o2)

b = b.insert(o3)insert(o3)

b.rightChild:Nodenew(o3)

{b.info < o1}

{b.info > o2}

Singleton/Kompositum 11. Patterns und Frameworks

ein binärer Suchbaum: Entwurf als Kompositum und mit leerem Baum als Singleton

62iTec

public interface BinSearchTree {

boolean isEmpty();

boolean isIn(Object e);

BinSearchTree insert(Object e);}//----------------------------------------------------------------public class EmptyTree implements BinSearchTree {

private static EmptyTree empty = new EmptyTree();

private EmptyTree() {}

public static EmptyTree Instance() { return empty;

}

public boolean isEmpty() { return true; }

public boolean isIn(Object e) { return false; }

public BinSearchTree insert(Object e) {return new Node(e);

}}

ein binärer Suchbaum: JAVA Code

Benutzung: Instance() als "Konstruktor"gibt einziges empty alsEmptyTree-Objekt heraus

Benutzung: Instance() als "Konstruktor"gibt einziges empty alsEmptyTree-Objekt heraus

alle Konstruktoren sind damit privat

alle Konstruktoren sind damit privat

einzige Instanz alsKlassenattribut

einzige Instanz alsKlassenattribut

hier wird aus dem einzigenEmptyTree-Objekt jeweilsein neuer Baum erzeugt der nur aus einer Wurzel besteht

hier wird aus dem einzigenEmptyTree-Objekt jeweilsein neuer Baum erzeugt der nur aus einer Wurzel besteht

Singleton/Kompositum 11. Patterns und Frameworks

63iTec

public class Node implements BinSearchTree {

protected Object info;protected BinSearchTree left;protected BinSearchTree right;

public Node(Object info) {

this.info = info;

left = EmptyTree.Instance();

right = EmptyTree.Instance();

}

public boolean isEmpty() { return false; }

public boolean isIn(Object e) {switch ( info.compareTo(e) ) {

case -1: return left.isIn(e);case 0: return true;case +1: return right.isIn(e);

}return false;

}

public BinSearchTree insert(Object e) {

switch ( info.compareTo(e) ) {case -1:

left = left.insert(e);break;

case 0: break;case +1:

right = right.insert(e);break;

}return this;

}}

Singleton/Kompositum 11. Patterns und Frameworks

Kompositum: füge leere Bäume als Blätter ein

Kompositum: füge leere Bäume als Blätter ein

64iTec

Singleton/Kompositum 11. Patterns und Frameworks

public static void main( String args[ ] ) {

BinSearchTree tree = EmptyTree.Instance();

tree = readTree( tree, "dateiname" );

. . .

}

public BinSearchTree readTree( BinSearchTree bst, String datei ) {int wert;

// in einer Schleife werte einlesen. . .

bst = bst.insert( Integer(wert) );

. . .}

Benutzung des binären Suchbaumes

Achtung: falls ein leerer Baum übergeben wird, ändert sich die Objektreferenz durch die Einfügung des ersten Knotens

Achtung: falls ein leerer Baum übergeben wird, ändert sich die Objektreferenz durch die Einfügung des ersten Knotensunser Binärbaum hat allgemeine

Knoten, die Informationen vom Typ Object halten (keine Templates!)Deshalb: Wrapperklasse um denIntegerwert!

unser Binärbaum hat allgemeine Knoten, die Informationen vom Typ Object halten (keine Templates!)Deshalb: Wrapperklasse um denIntegerwert!

65iTec

Kompositum 11. Patterns und Frameworks

wichtig beim Kompositum ist die Unterscheidung von Klassen- undObjektbäumen – das Kompositum generiert Objektbäume

Klasse1

Klasse12Klasse11

Klasse122Klasse121

objA

objCobjB

objEobjDobjF

q Klassenbäume sind statische Vererbungshierarchienq Objektbäume sind dynamisch erzeugte Bäume mit Knotenobjekten

66iTec

q Name: Dekorierer (decorator oder wrapper)

q Absicht: füge einem Objekt dynamisch Zusatzfunktionalität hinzu

q Problem: wenn man zu einer Basisfunktionalität wie Grafikdar-stellung oder einer Ein-/Ausgabe vielfache Zusatzfunktionalität wie in einem Baukasten frei kombinierbar hinzufügen möchte, ergibt sich rasch eine kombinatorische Vielfalt, die man nur noch schwer in einer statischen Klassenstruktur darstellen und warten kann.

q Lösungsidee: kombiniere die Zusatzfunktionalität dynamisch in einer Umhüllung in mehreren Schichten (Wrapper) um das ursprüngliche Objekt herum. Jede Hülle (Dekoriererklasse) kann genauso angesprochen werden wie das ursprüngliche Objekt

Dekorierer 11. Patterns und Frameworks

67iTec

Dekorierer

+operation()

KonkreterDekoriererA

+operation()#zusatzOperationA()

+operation()#zusatzOperationB()

{abstract}

Komponente

+operation()

{abstract}1

hatKomponente

KonkreteKomponente

+operation()

KonkreterDekoriererB

. . .

Struktur

Dekorierer 11. Patterns und Frameworks

operation() {zusatzoperationA();//sende operation weiter:hatKomponente.operation();

}

68iTec

q Komponente: die Schnittstelle für einen Klienten zum Gebrauch eines dekorierten Objektes

q KonkreteKomponente: Objekt, das eine Basisfunktionalität bereitstellt welche mit Zusatzfunktionalität dekoriert werden kann

q Dekorierer: enthält eine Referenz zu einer weiteren Komponente auf der die Operation weitergesandt wird

q KonkreterDekorierer: fügt Zusatzfunktionalität zur Operation der KonkretenKomponente hinzu (dekoriert)

Dekorierer 11. Patterns und Frameworks

Rollen

69iTec

Dekorierer 11. Patterns und Frameworks

Zusammenspiel

kp:KonkreteKomponente

dA:KonkreterDekoriererA

hatKomponente

dB:KonkreterDekoriererB

hatKomponente

operation() zusatzOperationA()

operation() zusatzOperationB()

operation()

70iTec

Decorator

+draw()

BorderDecorator

+draw()#borderDraw()

ScrollDecorator

+draw()#scrollDraw()

{abstract}

Component

+draw()

{abstract} 1

hasComponent

TextView

+draw()

SW1:ScrollDecorator

draw()

BW1:BorderDecorator

draw()

T1:TextView

draw()

hasComponent. draw()borderDraw()

. . . /*display text*/ . . .

Beispiel

Dekorierer 11. Patterns und Frameworks

hasComponent. draw()scrollDraw()

71iTec

q die Verbindung der Komponenten über hatKomponente wird im Konstruktor erzeugt:

KonkreteKomponente kp = new KonkreteKomponente();KonkreterDekoriererA kdA = new KonkreterDekoriererA( kp ); //kdA mit kp verbundenKonkreterDekoriererB kdB = new KonkreterDekoriererB( kdA ); //kdB " kdA ". . .kdB.operation();

oder:

KonkreterDekoriererB kdB = new KonkreterDekoriererB( new KonkreterDekoriererA(

new KonkreteKomponente( ) ) );

Dekorierer 11. Patterns und Frameworks

Konsequenzen

KonkreterDekoriererB

KonkreterDekoriererA

KonkréteKomponente

72iTec

q das Muster erlaubt, alle Kombinationen von Zusatzfunktionalität in einer einfachen Klassenstruktur zu beschreiben. Eine explizite Beschreibung wäre sehr aufwendig.

q es ist einfach, neue Zusatzfunktionalität einzufügen

q Nachteil: das vom Klienten angesprochene Objekt ist ein Dekorierer, nicht das Hauptobjekt (KonkreteKomponente): alle Dekorierer müssen sämtliche Operationen des Hauptobjekts anbieten, auch wenn sie diese nicht dekorieren

allerdings können diese Operationen für alle Konkreten-Dekorierer in der (abstrakten) Superklasse Dekorierer mit einfacher Delegation an das Hauptobjekt implementiert werden(siehe nächste Folie)

Dekorierer 11. Patterns und Frameworks

Konsequenzen

73iTec

Dekorierer

+operation1()+operation2()+operation3()

KonkreterDekoriererA

+operation()#zusatzOperationA()

+operation()#zusatzOperationB()

{abstract}

Komponente

+operation1()+operation2()+operation3()

{abstract}

1

hatKomponente

KonkreteKomponente

+operation1()+operation2()+operation3()

KonkreterDekoriererB

. . .

Dekorierer 11. Patterns und Frameworks

operation1() {zusatzoperationA();//sende operation weiter:hatKomponente.operation1();

}

operation2() {hatKomponente.operation2();

}operation3() {

hatKomponente.operation3();}

nichtdekorierte Operationenwerden einfach zur KonkretenKomponentedurchgereicht

74iTec

Dekorierer 11. Patterns und Frameworks

Zusammenspiel: Durchreichen nichtdekorierter Operationen

kp:KonkreteKomponente

dA:KonkreterDekoriererA

hatKomponente

dB:KonkreterDekoriererB

hatKomponente

operation3()

operation3()

operation3()

75iTec

Objektfabriken 11. Patterns und Frameworks

Problem:

Polygon[] pPZ;. . .pPZ[k++] = new Dreieck(p1,p2,p3);. . .pPZ[k++] = new Rechteck(lo, ru);. . .pPZ[k++] = new Polygon(parray);. . .optimiereLayout( pPZ, k ) ;

. . .pPZ

alles wird zu Polygonvoid optimiereLayout( Polygon[] pP, int anzahl) {. . .for ( i=0; i < anzahl; i++ ) {

f[i] = pP[i].berechneFlaeche();. . .pP[i].verschieben(dx, dy);pP[i].fuellen( rot );

}. . .

Polymorphismus in Vererbungs-hierarchien: man kann Spezialisierungenpolymorph benutzen, und neueSpezialisierungen verlangen keineÄnderung bei der Benutzung: schön!

Aber:irgendwo muss man die Objekteerzeugen - und da muss mankonkret werden. Diese Erzeugungenkönnen weit verstreut sein - eineÄnderung wird aufwendig und

fehleranfällig

Änderungswunsch:DreieckMitGrafik(

p1, p2, p3 )

Änderungswunsch:DreieckMitGrafik(

p1, p2, p3 )

76iTec

Objektfabriken 11. Patterns und Frameworks

Lösungsidee:

kann man nicht auch die Erzeugung kapseln - und dann sogarpolymorph gestalten?

Antwort: ja, und zwar in einer "Objekterzeugungsfabrik" - Object Factory

Objektfabrikerzeuge (gewünschtesObjekt ) neues Objekt

FigurenFabrikerzeuge( Dreieck) neues Dreieck

new DreieckMitGrafik(...)

Fabrikmuster sindErzeugungsmusterFabrikmuster sindErzeugungsmuster

77iTec

Objektfabriken 11. Patterns und Frameworks

abstract class Figur {public abstract void zeichne();public abstract void lösche();

}

class Kreis extends Figur {Kreis() {} //Konstruktor mit Paketsichtbarkeitpublic void zeichne() { System.out.println("Kreis.zeichne");

}public void lösche() { System.out.println("Kreis.loesche");

}}

class Rechteck extends Figur { . . .

1. Schritt:wie man die Erzeugung von Objekten kapseltpublic static Figur fabrik( String typ )

throws FalscheFigurenErzeugung {if ( typ.equals("Kreis") ) return new Kreis();if ( typ.equals("Rechteck") ) return new Rechteck();throw new FalscheFigurenErzeugung( typ );

}

78iTec

Objektfabriken 11. Patterns und Frameworkspublic class FigurenFabrik1 {String figlist[] = { "Kreis", "Rechteck",

"Rechteck", "Kreis", "Kreis", "Rechteck" };List figuren = new ArrayList();

public void test() {try {

for( int i = 0; i < figlist.length; i++)figuren.add( );

} catch( FalscheFigurenErzeugung e ) {System.out.println( e.getMessage() );

}Iterator figIt = figuren.iterator();while( figIt.hasNext() ) {Figur f = (Figur)figIt.next();f.zeichne();f.lösche();

}}public static void main(String args[]) {

new FigurenFabrik1().test();}

}

Figur.fabrik( figlist[i] )

79iTec

Objektfabriken 11. Patterns und Frameworks

ProduktFabrikcreate(. . .): Produktfabrik( . . . ): Produkt

Produkt

operation1(..)operation2(..). . .

Meu fabrik(. . .) {return create(. . .);

}

Produkt fabrik(. . .) {return create(. . .);

}

KonkretesProduktFabrikcreate(. . .): ProduktKonkretesProdukt

KonkretesProdukt(..)operation1(..)operation2(..). . .

(Konstruktor)

(Name)

Abhängigkeit (UML)

Klientfabrik(..)

2. Schritt: wie man eine polymorphe Erzeugung bereitstellt:das Fabrikmuster

Eine Anwendung benutzt die Produktfabrik, um Objekte zu erzeugen. Die KonkreteProduktFabrik erzeugt ein KonkretesProdukt, dessen Klasse für die Anwendung transparent ausgetauscht werden kann.

abstrakte Klasse:Product fabrik(..)

nicht implementiert

abstrakte Klasse:Product fabrik(..)

nicht implementiert

80iTec

Objektfabriken 11. Patterns und Frameworks

Fabrik-Beispiel: eine Menufabrik

Menufabrik

create(titel:String): Menufabrik(titel:String): Menu

Menu

addOption(option:String)removeOption(option:String)select(): String. . .

Menu fabrik(String titel) {return create(titel);

}

Menu fabrik(String titel) {return create(titel);

}

AWTMenufabrik

create(titel:String): Menu

KonsoleMenufabrik

create(titel:String): Menu

KonsoleMenu

addOption(option:String)removeOption(

option:String)select(): String. . .

AWTMenu

. . .

81iTec

Objektfabriken 11. Patterns und Frameworks

das Fabrikmuster kapselt die Erzeugung von Objekten einer Klasse. Häufig sind aber Objekte mehrerer zusammenhängender Klassen in einer Fabrik zu erzeugen.

das AbstrakteFabrik Muster

Objekt1fabrikerzeuge (gewünschtesObjekt1 ) neues Objekt1

Objekt2fabrikerzeuge (gewünschtesObjekt2 ) neues Objekt2

gemeinsame Basis(z.B. graphische Menuelemente ein

bestimmtes Betriebssystem)

82iTec

Objektfabriken 11. Patterns und Frameworks

AbstrakteFabrik: die Struktur

83iTec

q wenn man eine Anwendung braucht, die von der Erzeugung ihrer "Produkte" und deren Komposition/Aggregation unabhängig sein soll

q wenn man Produktfamilien hat

q im Design von Klassenbibliotheken

Objektfabriken 11. Patterns und Frameworks

Anwendbarkeit von Abstrakten Fabriken

da Polymorphismus einer der Pfeiler des objektorientierten Ansatzes ist,und eine polymorphe Objekterzeugung das Gegenstück zu polymorpher Benutzung von Objekten ist, ist das Fabrikmuster eines der am weitesten verbreiteten überhaupt!

Recommended