Objekt-Komposition versus Vererbung: Decorator-Design-Pattern

Ähnliche Dokumente
Konstruktion anpassbarer Software

Objektorientierte Programmierung OOP

Vorlesung Datenstrukturen

Entwurfsmuster. Marc Monecke

4. Vererbung. Idee der Vererbung. Wir wollen ein Verwaltungsprogramm für CDs und Videos entwickeln. Wir stellen uns dazu folgende Klassen vor:

Objektorientierte und Funktionale Programmierung SS 2014

Softwaretechnik. Überblick I. Prof. Dr. Rainer Koschke. Sommersemester 2009

Softwaretechnik. Prof. Dr. Rainer Koschke. Fachbereich Mathematik und Informatik Arbeitsgruppe Softwaretechnik Universität Bremen

Verteidigung Großer Beleg

Objektorientierte Programmierung

Software-Architektur. Design Patterns. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Objektorientiertes Software-Engineering

wenige Konzepte, keine Adressen, Anlehnung an C++ -Syntax Vererbung, Polymorphie/dynamisches Binden, umfangreiche Klassenbibliotheken

Algorithmen und Datenstrukturen

Tücken der dynamischen Bindung

Design Patterns II. Der Design Muster Katalog. Prof. Dr. Nikolaus Wulff

Programmierkurs Java. Vererbung. Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 2. Teil

Software Engineering

Objektorientierte Programmierung (OOP)

Design Patterns. (Software-Architektur) Prof. Dr. Oliver Braun. Letzte Änderung: :12. Design Patterns 1/26

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Praxis der Programmierung

Konzepte der Programmiersprachen

Software Engineering II (IB) Design Patterns

Entwurfsprinzip. Entwurfsprinzip

::Zweck. Sicherstellung, dass nur eine Instanz einer bestimmten Klasse existiert

Grundzüge der Programmierung. Wiederverwendung POLYMORPHIE

Objektorientiertes Programmieren

Probeklausur: Programmierung WS04/05

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

Überschreiben von Methoden

Einführung in die Programmierung I. 11. Vererbung. Stefan Zimmer

Design Patterns. 3. Juni 2015

Einführung in C# Teil 3. Matthias Nübling

IT I: Heute. Nachbetrachtung Wissensüberprüfung. Einführung Vererbung. Roboter in becker.robots. Filialenbelieferung 4.11.

Verträge und objektorientierter Entwurf

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

Klassen als Objekte. Smalltalk vs. Objective-C. Self-Nachrichten an Klassen in Objective-C. Klassen als Objekte. Smalltalk: Everything is an object

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

Objektorientierte Sprachen

Kapitel 2: OO Grundlagen

Ein Entwurfsmuster der GoF. vorgestellt von. Sigrid Weil 16. Januar 2008

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Software-Architektur Design Patterns

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

Polymorphie. 15. Java Objektorientierung II

1. Abstrakte Klassen

Erste Java-Programme (Java Wiederholung & Vererbung)

Polymorphie. 15. Java Objektorientierung II

Einstieg in die Informatik mit Java

Client-Server-Beziehungen

Praktikum. SEP: Java-Programmierung WS 2018/19. Modularisierung. Thomas Lemberger und Martin Spießl

Klassenbeziehungen & Vererbung

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

IT I: Heute. Nachbetrachtung Wissensüberprüfungen. Einführung Vererbung. Roboter in becker.robots. falls Zeit: Scheduling 8.11.

Einstieg in die Informatik mit Java

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Ersetzbarkeit und Verhalten

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Entwurfsmuster (Design Patterns)

Javakurs für Anfänger

Faustregeln zu Zusicherungen

Grundlagen der Informatik Vererbung von Klassen

IT I: Heute. Nachbetrachtung Wissensüberprüfungen. Einführung Vererbung. Roboter in becker.robots IT I - VO 5 1

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Vererbung, Polymorphismus

Objektorientierte Programmierung und Klassen

Lukas Klich. Projektgruppe SHUTTLE. Seminar: Entwurfsmuster Lukas Klich/Projektgruppe SHUTTLE Seite: 1. Entwurfsmuster

Software-Entwurfsmuster (weitere) A01 OOP. Software-Entwurfsmuster (weitere)

C++ - Objektorientierte Programmierung Vererbung

Einstieg in die Informatik mit Java

Inhaltsverzeichnis. Kurseinheit 1. Kurseinheit 2

Informationsverarbeitung im Bauwesen

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Geschachtelte Klassen

Einführung in die Programmiersprache Java II

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Vererbung. Oberklassen und Unterklassen

Software Engineering II (IB) Design Patterns

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Einführung in die Programmierung mit C++

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

Vererbung, Polymorphie

Manfred Schüttengruber. Objektorientierte Programmierung mit Visual Basic 2005

Tafelübung 07 Algorithmen und Datenstrukturen

~±] Inhalt. 1.1 Ähnlichkeiten zwischen C# und Java Unterschiede zwischen C# und Java Das.NET-Framework 4 1.

Einstieg in die Informatik mit Java

Refactoring Transformationen. Martin Freund Januar 2003 Seminar Refactoring in extreme Programming AG Kastens Universität Paderborn

Grundelemente objektorientierter Sprachen (1)

Überblick. Überblick. Abstrakte Klassen - rein virtuelle Funktionen Beispiele

Programmierkurs C++ Abstrakte Klassen und Methoden

Arten von Klassen-Beziehungen

Transkript:

Objekt-Komposition versus Vererbung: Decorator-Design-Pattern O.Univ.-Prof. Dipl.-Ing. Dr. Wolfgang Pree Fachbereich Informatik cs.uni-salzburg.at

Motivation: Änderungen einer Klasse mit vielen Unterklassen (I) Änderungen von M3() und M7() in Klasse A erforderlich Quelltext von A, wenn vorhanden, ändern? Änderung durch Vererbung? 2

Motivation: Änderungen einer Klasse mit vielen Unterklassen (II) für eine Klasse (zb A1m) ist die Anpassung sinnvoll für alle Unterklassen von A ist das aufwändig 3

Motivation: Änderungen einer Klasse mit vielen Unterklassen (III) In Programmiersprachen, die mehrfache Vererbung unterstützen, können sogenannte Mix-In-Klassen definiert werden dennoch muss für jede Klasse, deren Verhalten angepasst werden soll, eine Unterklasse gebildet werden 4

Änderung einer Klasse durch Komposition statt durch Vererbung dekoriert A In der Klasse WrapperOfA werden alle Methoden von A überschrieben, indem der Methodenaufruf jeweils an ein über die Instanzvariable wrappeda referenziertes Objekt delegiert wird mit Ausnahme jener, die geändert werden. Da WrapperOfA eine Unterklasse von A ist, kann überall dort, wo ein Objekt vom statischen Typ A gefordert wird, eine Instanz der Klasse WrapperOfA verwendet werden. Da die Instanzvariable wrappeda den statischen Typ A hat, kann sie auf jedes Objekt einer Unterklasse von A verweisen. 5

Decorator: Anpassung durch Komposition mit beliebig vielen Objekten statt durch Vererbung Namen der Template- und Hook-Methoden sind gleich Hinzufügen von Decorator-Objekten mit SetH() Eine Instanz des Decorators (Filters) T zusammen mit der Instanz einer Unterklasse von H kann von Klienten wie ein H-Objekt verwendet werden. Allerdings wird das Verhalten des H-Objektes dadurch modifiziert. H + Decorator(s) sind als ein Objekt verwendbar (vgl. Composite) 6

Vorschlag für einen Entwurf, wenn mehrere Decorator-Klassen verwendet werden 7

zwei exemplarische Kompositionen 8

Beispiel: Abrunden von Flugmustern 9

Beispiel: Abrunden von Flugmustern 10

Verwendung der Decorator-Klasse Smoother FlightPattern triangle= new FlightPattern(); triangle.setstartpos(...); triangle.addseg(new Smoother(new Line(...))); triangle.addseg(new Smoother(new Line(...))); triangle.addseg(new Line(...)); 11

Rahmenbedingungen für die Anwendung des Decorator-Konstruktionsprinzips (I) Die Signatur von H, also von der Wurzelklasse des Teilbaums, soll von den Unterklassen von H nicht erweitert werden. Der Grund dafür ist, dass zusätzliche Methoden in den Unterklassen, die die Signatur der Wurzelklasse erweitern, in den Decorator-Klassen nicht berücksichtigt werden können. Um die Erfüllung dieser Forderung sicherzustellen, ist es notwendig, dass die Gemeinsamkeiten aller Unterklassen von H in die Wurzelklasse transferiert, das heißt faktorisiert werden. Bei vielen Klassenbibliotheken ist diese Forderung nicht erfüllt. Die Anwendung des Decorator- Konstruktionsprinzips ist daher in solchen Fällen nicht immer in vollem Umfange möglich. (vgl. Decorator Smoother) 12

Rahmenbedingungen für die Anwendung des Decorator-Konstruktionsprinzips (II) In unserem Beispiel müssen daher die spezifischen Methoden für die erwähnten Objekte bei Line SetLine(); bei Circle SetDirection(), sowie die Methoden zur Festlegung der Ebene, in der der Kreis liegt: bei FlightPattern AddSeg() und RemoveSeg() explizit aufrufen werden, da sie von einer Smoother-Instanz nicht weitergeleitet werden können: Circle circle= new Circle(...); circle.setdirection(cright); Smoother smoother= new Smoother(circle); Wäre die erwähnte Forderung erfüllt, könnte eine Smoother-Instanz wie jedes spezifische FlightSegment-Objekt behandelt werden: Smoother smoother= new Smoother(new Circle(...)); smoother.setdirection(cright); Eine Möglichkeit, die Flugsegment-spezifischen Methoden zu eliminieren, ist, alle Eigenschaften nur über den Konstruktor der jeweiligen Klasse angeben zu lassen: Smoother smoother= new Smoother(new Circle(..., cright)); 13

Anwendung des Decorator-Konstruktionsprinzips zum Entwurf leichtgewichtiger Wurzelklassen Das Decorator-Konstruktionsprinzip kann dazu herangezogen werden, Klassen nahe der Wurzel des Klassenbaumes leichtgewichtiger zu machen. Funktionalität, die nicht in allen Klassen benötigt wird, wird in Decorator-Klassen implementiert. Nur jene Objekte, welche die spezielle Funktionalität benötigen, erhalten diese durch Komposition mit der entsprechenden Decorator-Instanz. Das Decorator-Konstruktionsprinzip kann daher sowohl beim (Erst-)Entwurf einer Klassenhierarchie als auch bei der Erweiterung von Klassenhierarchien nutzbringend eingesetzt werden. 14

Beispiel: Clipping-Mechanismus bei GUI-Bibliotheken Clipping-Mechanismus: das Zuschneiden eines GUI- Elements auf dessen festgelegte Größe Da der Clipping-Mechanismus nicht für alle GUI- Elemente benötigt wird, ist es sinnvoll, den Clipping- Mechanismus nicht in der Wurzel des Teilbaumes vorzusehen, sondern eine Decorator-Klasse Clipper einzuführen. (vgl. Decorator-Beispiel in Gamma et al., 1995) 15

Zusammenfassung Decorator + einfache Anpassung durch Objektkomposition + neue Decorator-Elemente (Template-Klassen, die Unterklassen der Hook-Klasse sind) können definiert werden, ohne die Unterklassen der Hook-Klasse verändern zu müssen; + leichtgewichtige Klassen können damit elegant realisiert werden allerdings sollte die Hook-Klasse die erwähnte Rahmenbedingung erfüllen (faktorisiert Verhalten aus allen Unterklassen heraus) zusätzliche Indirektion bei Methodenaufrufen komplexe Interaktionen zwischen beteiligten Objekten 16