Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Entwurfsmuster in Java Das Observer- und das Decorator-Pattern Friederike L¨ owe

13. M¨arz 2011

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Inhaltsverzeichnis Einleitung Wozu eigentlich Entwurfsmuster? Die Grundlage: Design-Prinzipien Das Decorator-Pattern Das Muster am Beispiel erkl¨art Dekorierer aus der Praxis: Java I/O Das Observer-Pattern Allgemein: Was ist das Observer-Pattern? Observer in Java Ausblick Wie geht’s weiter? Andere Entwurfsmuster Referezen

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Einleitung

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Wo ist der Unterschied?

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Irgendjemand hat deine Probleme schon gel¨ost.

Die meisten Probleme, die einem beim Programmieren begegnen k¨onnen, hat schon einmal jemand gel¨ ost. Besonders erfolgreiche L¨osungsstrategien, die sich f¨ ur eine bestimmte Art von Problem bew¨ahrt haben, wurden als L¨ osungsmuster gesammelt.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Grundregeln

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Entwurfsprinzip

Programmiere auf eine Schnittstelle, nicht auf eine Implementierung.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Quellen

Entwurfsprinzip

Identifiziere die Aspekte deiner Anwendung, die sich ¨andern k¨onnen und trenne sie von denen, die konstant bleiben.

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Entwurfsprinzip

Ziehe Komposition der Vererbung vor.

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Entwurfsprinzip

Strebe bei deinen Entw¨ urfen mit interagierenden Objekten nach lockerer Kopplung.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Entwurfsprinzip

Klassen sollten f¨ ur Erweiterung offen, aber f¨ ur Ver¨anderung geschlossen sein.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Was sind Entwurfsmuster?

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Das Decorator-Pattern

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Ein Kaffeehaus... urspr¨ungliches Bestellsystem

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Extras

Zum Kaffee kann man verschiedene Zutaten dazu bestellen, wie etwa: • heiße Milch • Sojamilch • Schokolade • Milchschaum • ....

Jede dieser Zutaten kostet nat¨ urlich extra. Wie kann man das in das Bestellsystem integrieren?

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ein erster Versuch...

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Neuer Ansatz!

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Problempotential?

• Preis¨ anderungen bei den Zutaten → Bearbeitung von

bestehendem Code ¨ • neue Zutaten → neue Methoden in der Superklasse, Andern der preis()-Methode • Einf¨ uhren neuer Getr¨anke → Eistee mit Milchschaum?? • Was ist, wenn ein Kunde Doppelschoko w¨ unscht? • Was noch....?

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

So geht es: Das Decorator-Muster

Ein Getr¨ank wird mit Zutaten dekoriert, z.B bestellt ein Kunde eine dunkle R¨ostung mit Schoko und Milchschaum. 1. Wir nehmen ein DunkleR¨ ostung-Objekt, 2. dekorieren es mit einem Schoko-Objekt, 3. dekorieren es mit einem Milchschaum-Objekt, 4. rufen die Methode preis() auf und st¨ utzen uns auf Delegierung um den Preis f¨ ur die Zutaten hinzuzuf¨ ugen.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Ein Getr¨ank mit Dekorieren aufbauen

Wir nehmen uns ein DunkleR¨ ostung-Objekt,...

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Ein Getr¨ank mit Dekorieren aufbauen ...erzeugen uns ein Schoko-Objekt und packen es um DunkleR¨ostung,...

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Ein Getr¨ank mit Dekorieren aufbauen ...erstellen einen Milchschaum-Dekorierer und packen Schoko damit ein.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Quellen

Ein Getr¨ank mit Dekorieren aufbauen: Zwischenstand • Dekorierer haben den gleichen Supertyp wie die Objekte, die

sie dekorieren. • Man kann ein oder mehr Objekte verwenden, um ein Objekt

einzupacken. • Da der Dekorierer den gleichen Supertyp wie das dekorierte

Objekt hat, k¨onnen wir das dekorierte Objekt an der Stelle des urspr¨ unglichen (jetzt eingepackten) Objekts herumreichen. • Der Dekorierer f¨ ugt sein eigenes Verhalten hinzu, bevor

und/oder nachdem der Aufruf an das dekorierte Objekt delegiert wurde, um die Arbeit abzuschließen. • Objekte k¨ onnen jederzeit dekoriert werden. Wir k¨onnen

Objekte also zur Laufzeit dynamisch mit so vielen Dekorierern dekorieren, wie es uns gef¨allt.

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Ein Getr¨ank mit Dekorieren aufbauen

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Quellen

Dekorierer aus der Praxis: Java I/O

BufferedInputStream und LineNumerInputStream erweitern beide FilterInputStream, die als abstrakte Dekorierer-Klasse dient.

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Quellen

Java I/O – Klassendiagramm

BufferedInputStream und LineNumerInputStream erweitern beide FilterInputStream, die als abstrakte Dekorierer-Klasse dient.

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Das Observer-Pattern

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Das Observer-Muster

Das Observer-Muster erm¨ oglicht einem oder mehreren Objekten, automatisch auf die Zustands¨anderung eines bestimmten Objekts zu reagieren, um den eigenen Zustand anzupassen.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

ein Zeitungsabonement

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Das Observer-Muster: Schema Das Observer-Muster definiert eine Eins-zu-viele-Abh¨angigkeit zwischen Objekten in der Art, dass alle abh¨angigen Objekte benachrichtigt werden, wenn sich der Zustand des einen Objekts ¨andert.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Das Observer-Muster: Klassendiagramm

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Observable und Observer in Java

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ein Beispiel

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Quellen

Irgendjemand hat also deine Probleme schon gel¨ost.

Am besten nutzt man Entwurfsmuster, indem man sein Ged¨achtnis mit ihnen f¨ uttert und in bestehenden Anwendungen die Stellen erkennt, an denen man sie einsetzten kann. Statt Code-Wiederverwertung bieten Muster Erfahrungs-Wiederverwertung.

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Wie finde ich ein passendes Entwurfsmuster? 1. Klassifizierung nach der Aufgabe: • Erzeugungsmuster betreffen den Prozess der

Objekterzeugung • Strukturmuster befassen sich mit der Zusammensetzung von

Klassen und Objekten • Verhaltensmuster charakterisieren die Art und Weise, in der

Klassen und Objekte zusammenarbeiten und Zust¨andigkeiten aufteilen

2. Klassifizierung nach G¨ ultigkeitsbereich: • klassenbasiert (Beziehungen mit Hilfe von Vererbung,

statisches Verhalten) • objektbasiert (Beziehungen zwischen zusammenarbeitenden

Objekten, dynamisch ¨anderbares Verhalten)

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

¨ Uberblick u¨ber Entwurfsmuster

C

O

Erzeugermuster Fabrikmethode

Strukturmuster Adapter (klassenbasiert)

Abstrakte Fabrik Erbauer Prototyp Singleton

Adapter (objektbasiert) Br¨ ucke Dekorierer Fassade Fliegengewicht Kompositum Proxy

Verhaltensmuster Interpreter Schablonenmethode Befehl Beobachter Besucher Iterator Memento Strategie Vermittler Zustand Zust¨andigkeitskette

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Erzeugungsmuster: Fabrikmethode

Definiere eine Klassenschnittstelle mit Operationen zum Erzeugen eines Objekts, aber lasse Unterklassen entscheiden, von welcher Klasse das zu erzeugende Objekt ist. Fabrikmethoden erm¨oglichen es einer Klasse, die Erzeugung von Objekten an eine Unterklasse zu delegieren.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Erzeugungsmuster: Singleton

Sichere ab, dass eine Klasse genau ein Exemplar besitzt, und stelle einen globalen Zugriffspunkt darauf bereit.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Strukturmuster: Adapter

Passe die Schnittstelle einer Klasse an eine andere von ihren Klienten erwartete Schnittstelle an. Das Adaptermuster l¨asst Klassen zusammenarbeiten, die wegen inkompatibler Schnittstellen ansonsten dazu nicht in der Lage w¨aren.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Strukturmuster: Dekorierer

Erweitere ein Objekt dynamisch um Zust¨andigkeiten. Dekorierer bieten eine flexible Alternative zur Unterklassenbildung, um die Funktionalit¨at einer Klasse zu erweitern.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Quellen

Strukturmuster: Fassade

Biete eine einheitliche Schnittstelle zu einer Menge von Schnittstellen eines Subsystems. Die Fassadenklasse definiert eine abstrakte Schnittstelle, welche die Verwendung des Subsystems vereinfacht.

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Verhaltensmuster: Beobachter

Definiere eine 1-zu-n-Abh¨angigkeit zwischen Objekten, so dass die ¨ Anderung des Zustands eines Objekts dazu f¨ uhrt, dass alle abh¨angigen Objekte benachrichtigt und automatisch aktualisiert werden.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Verhaltensmuster: Iterator

Biete eine M¨oglichkeit, um auf die Elemente eines zusammengesetzten Objekts sequentiell zugreifen zu k¨onnen, ohne die zugrundeliegende Repr¨asentation offenzulegen.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Verhaltensmuster: Strategie

Definiere eine Familie von Algorithmen, kapsele jeden einzelnen und mache sie austauschbar. Das Strategiemuster erm¨ oglicht es, den Algorithmus unabh¨angig von ihn nutzenden Klienten zu variieren.

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Ausblick

Quellen

Eine Warnung zum Schluss... Software-Entw¨urfe sollten so einfach wie m¨oglich sein. Wenn man ein Pattern ausgew¨ahlt hat, bleibt die Frage: Bietet mir der Entwurf mit dem Pattern erhebliche Vorteile bez¨ uglich • Flexibilit¨ at • Performance oder • Wiederverwertbarkeit? In Zweifelsf¨ allen w¨ ahlen Sie den einfacheren Weg. Karl Eilebrecht / Gernot Starke

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Referezen

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Quellen & Literatur I Freeman, Elithabeth und Eric: Head First - Design Patterns O’Reilly, Cambridge, 2004 Eilebrecht, Karl und Starke, Gernot: Patterns kompakt: Entwurfsmuster f¨ ur effektive Software-Entwicklung Spektrum, Heidelberg, 2010 http://dx.doi.org/10.1007/978-3-8274-2526-3 Gamma, Erich et.al: Entwurfsmuster Addison-Wesley, Bonn, 1996

Ausblick

Quellen

Einleitung

Das Decorator-Pattern

Das Observer-Pattern

Quellen & Literatur II

Ullenboom, Christian: Java ist auch eine Insel Galileo Press, Bonn, 2005

Ausblick

Quellen