Entwurfsmuster - Iterator & Composite

Ähnliche Dokumente
Entwurfsmuster - Iterator

Software Design Patterns Zusammensetzung. Daniel Gerber

Objektorientierte und Funktionale Programmierung SS 2014

Programmiertechnik II WS 2017/18

Überblick FBC SNW Zusammenfassung. Entwurfsmuster. Eine Einführung. Botond Draskoczy. Marcus Vitruvius Pollio

185.A Software-Entwurfsmuster 1 OOP. Software-Entwurfsmuster

Programmiertechnik II SS Fakultät Informatik Bachelor Angewandte Informatik

Entwurfsmuster (Design Patterns)

Zweck: sequentieller Zugriff auf Elemente eines Aggregats. mehrere Abarbeitungen des Aggregatinhalts

Zweck: sequentieller Zugriff auf Elemente eines Aggregats

Einstieg in die Informatik mit Java

Design Patterns. 3. Juni 2015

Ausnahmebehandlung in Java

Software-Entwurfsmuster

Lineare Datenstrukturen: Felder, Vektoren, Listen Modelle: math. Folge (a i ) i=1.. mit Basistyp T oder: [T]

Verteidigung Großer Beleg

Entwurfsmuster Martin Fesser 00IN

Objektorientierteund FunktionaleProgrammierung

Design Pattern. Motivation, Beispiel Definition "Das" Buch der Gang of Four Ausführliches Beispiel: Facade Beispiele. Aufgabe

Einführung in die Informatik II

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

JUnit a Cook s Tour. Framework in Java Automatisierter Ablauf von Testfällen Testläufe kombinieren. Unterlagen als PDF auf der Übungsseite!

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

Analyse und Modellierung von Informationssystemen

Objektorientierte und Funktionale Programmierung

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

Model-View-Controller

Faulheit professionell: Fertige Datenbehälter. Das Java-Collections-Framework Typsicherheit Generische Klassen

Structural Patterns. B. Sc. Andreas Meißner

II.4.4 Exceptions - 1 -

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Strategy & Decorator Pattern

II.4.6 Collections - 1 -

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

Entwurfsmuster in Java

Software-Entwurfsmuster

SE Besprechung. Übung 4 Architektur, Modulentwurf

Grundkonzepte java.util.list

Programmierkurs Java

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

UNIVERSITÄT SIEGEN Fachbereich 12, Elektrotechnik und Informatik Fachgruppe Betriebssysteme / verteilte Systeme

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

ALP II Dynamische Datenmengen

Objektorientierte Programmierung

Design Patterns. 5. Juni 2013

Entwurfsmuster. Marc Monecke

Effizientes Programmieren

Effizientes Programmieren

Verhaltensmuster. Entwurfsmuster - Design Patterns. HAW Hamburg Fakultät Technik und Informatik Department Informations- und Elektrotechnik

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

Programmieren in Java

Info B VL 14: Java Collections/Reflections

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

Funktionales Programmieren mit objektorientierten Sprachen

Software Engineering. 11. Entwurfsmuster III. Franz-Josef Elmer, Universität Basel, HS 2015

Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter

JAVA KURS COLLECTION

Analyse und Modellierung von Informationssystemen

Analyse und Modellierung von Informationssystemen

Wahlpflichtfach Design Pattern

public interface Stack<E> { public void push(e e); public E pop();

Software Entwicklung 1

Vorlesung Programmieren

Design Patterns I. Observer, Listener & MVC

Übungsserie Nr. 6. Ausgabe: 1. April 2015 Abgabe: 15. April Hinweise

Mengen und Multimengen

Kapitel 5: Iterierbare Container

Einführung: Verteilte Systeme - Remote Method Invocation -

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

Programmiermethodik 3. Klausur Lösung

Universität Bremen. Entwurfsmuster. Thomas Röfer. Wettbewerb Motivation Erzeugende Muster Strukturelle Muster Verhaltensmuster

Mustersuche in Quellcode

12 Abstrakte Klassen, finale Klassen und Interfaces

Mengen und Multimengen

Tutorium Softwaretechnik I

Informatik II. Übungsstunde 6. Distributed Systems Group, ETH Zürich

14 Design Patterns Einführung 14.2 Composite Pattern

Allgemeine Informatik II SS :30-11:30 Uhr

Übersicht. Softwarearchitektur. Softwarearchitektur, UML, Design Patterns und Unit Tests. Softwarearchitektur

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 17/18. Kapitel 14. Bäume. Bäume 1

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

Software-Architektur Design Patterns

Creational Patterns. Seminar Software-Entwurf. Thomas Liro WS 2004/05.

Programmieren in Java -Eingangstest-

Probeklausur: Programmierung WS04/05

Das Interface-Konzept am Beispiel der Sprache Java

Abstrakte Datentypen und Java

Programmieren 2 16 Java Collections und Generizität

Kapitel 8: Grafische Benutzerschnittstellen

Softwaretechnik WS 16/17. Übungsblatt 01

Entwurfsmuster. Rainer Schmidberger

Listen. M. Jakob. Gymnasium Pegnitz. 20. September Hinführung: Wartenschlangen. Grundprinzip von Listen Rekursion

Entwurfsprinzip. Entwurfsprinzip

Physikalisch Technische Lehranstalt Wedel 31. Januar 2004 Prof. Dr. Uwe Schmidt

Einführung in die Informatik

Transkript:

Entwurfsmuster - Iterator & Composite Alexander Rausch Seminar Entwurfsmuster WS08/09 19. November 2008

Gliederung 1 Einführung 2 Das Iterator Entwurfsmuster 3 Das Composite Entwurfsmuster 4 Quellen 5 Ende 2 / 39

Einführung Ein Beispiel zur Veranschaulichung bestehende Hotelmanagement-Software soll erweitert werden Software besitzt Module für Raum- und Veranstaltungsverwaltung 3 / 39

Problemstellung Klassen benutzen Datenstrukturen (ArrayList, HashMap... ), um Sammlungen von Objekten zu verwalten. solche Klassen werden auch als Aggregate bezeichnet Objekte einer Sammlung heißen Elemente Problemstellung Client... möchte diese Sammlung durchlaufen möchte auf die einzelnen Elemente zugreifen arbeitet mit Aggregatklassen, die unterschiedliche Datenstrukturen nutzen 4 / 39

Beispiel für das Problem 5 / 39

Ein Lösungsansatz p u b l i c v o i d showoverview ( ) { Room [ ] allrooms = roommanagement. getrooms ( ) ; A r r a y L i s t <Event> a l l E v e n t s = e v e n t C a l e n d a r. g e t E v e n t s ( ) ; / A l l e Räume a n z e i g e n / f o r ( i n t i =0; i < allrooms. l e n g t h ; i ++) { i f ( allrooms [ i ]!= n u l l ) { allrooms [ i ]. p r i n t I n f o ( ) ; / A l l e V e r a n s t a l t u n g e n a n z e i g e n / f o r ( i n t i =0; i < a l l E v e n t s. s i z e ( ) ; i ++) { a l l E v e n t s. g e t ( i ). p r i n t I n f o ( ) ; 6 / 39

Nachteile Client muss sich um Traversierungslogik kümmern starke Kopplung zwischen Client und Aggregat Wartung wird erschwert doppelter Code für gleiche Problematik 7 / 39

Das Iterator Entwurfsmuster objektbasiertes Verhaltensmuster bietet die Möglichkeit auf Elemente in einer Aggregatklasse sequentiell zuzugreifen erlaubt es mehrere Aggregate mit dem gleichen Code zu durchlaufen Client muss nicht die Implementierung des Aggregats kennen entkoppelt Aggregat und Logik für die Iteration 8 / 39

Hohe Kohäsion 9 / 39

Iterator Struktur 10 / 39

Teilnehmer - Iterator legt Methoden fest, die ein Client für das Traversieren benötigt alle ConcreteIterator Klassen müssen dieses Interface implementieren p u b l i c i n t e r f a c e I t e r a t o r { p u b l i c boolean hasnext ( ) ; p u b l i c O b j e c t n e x t ( ) ; p u b l i c v o i d remove ( ) ; 11 / 39

Teilnehmer - ConcreteIterator Konkreter Iterator für bestimmtes Aggregat enthält die Logik zum Durchlaufen der Collection implementiert eine konkrete Traversierungsart Beispiel: Vorwärts / Rückwärts traversieren Filter anwenden 12 / 39

Teilnehmer - ConcreteIterator p u b l i c c l a s s C o n c r e t e I t e r a t o r implements I t e r a t o r { p r i v a t e L i s t [ ] c o l l e c t i o n ; p r i v a t e i n t p o s i t i o n ; p u b l i c C o n c r e t e I t e r a t o r ( C o n c r e t e A g g r e g a t e a g g r e g a t e ) { / R e f e r e n z e n s p e i c h e r n / p u b l i c boolean hasnext ( ) { / P r ü f e n ob e i n w e i t e r e s Element vorhanden i s t / p u b l i c O b j e c t n e x t ( ) { / A k t u e l l e s Element ausgeben und P o s i t i o n i n k r e m e n t i e r e n / p u b l i c v o i d remove ( ) { / O p t i o n a l : A k t u e l l e s Element l ö s c h e n / 13 / 39

Teilnehmer - Aggregate Schnittstelle für den Client zu der Aggregatklasse(n) Minimum: Methode, welche passenden Iterator liefert p u b l i c i n t e r f a c e Aggregate { p u b l i c I t e r a t o r i t e r a t o r ( ) ; Beispiel für eine Factory-Methode 14 / 39

Teilnehmer - ConcreteAggregate enthält eine Collection (Sammlung) von Objekten implementiert iterator() Methode liefert passenden Iterator kümmert sich nur um das Verwalten der Collection 15 / 39

Teilnehmer - ConcreteAggregate p u b l i c c l a s s C o n c r e t e A g g r e g a t e implements Aggregate { p r i v a t e L i s t <ClassOfElement > c o l l e c t i o n ; / Verwaltunsmethoden f ü r d i e C o l l e c t i o n / p u b l i c v o i d addelement ( O b j e c t o ) {... p u b l i c v o i d removeelement ( O b j e c t o ) {... p u b l i c L i s t <ClassOfElement > g e t E l e m e n t s ( ) {... / L i e f e r t den k o n k r e t e n p a s s e n d e n I t e r a t o r f ü r d i e s e C o l l e c t i o n / p u b l i c I t e r a t o r i t e r a t o r ( ) { r e t u r n new C o n c r e t e I t e r a t o r ( t h i s ) ; 16 / 39

Teilnehmer - Client muss nur Interfaces Aggregate und Iterator kennen ist sicher vor Änderungen am Aggregate-Code flexibel dank Iterator Interface / Aggregate K l a s s e mit i r g e n d e i n e r L i s t e von Objekten / Aggregate a g g r e g a t e = new C o n c r e t e A g g r e g a t e ( a l i s t ) ; / Passenden I t e r a t o r h o l e n / I t e r a t o r m y I t e r a t o r = a g g r e g a t e. i t e r a t o r ( ) ; w h i l e ( m y I t e r a t o r. hasnext ( ) ) { / das a k t u e l l e Element geben l a s s e n / C l a s s O f E l e m e n t e l e m e n t = ( C l a s s O f E l e m e n t ) m y I t e r a t o r. n e x t ( ) ; / o d e r man b e n u t z t e i n I n t e r f a c e / CommonInterface e l e m e n t = ( CommonInterface ) m y I t e r a t o r. n e x t ( ) ; 17 / 39

Interne und externe Iteratoren Es gibt zwei Arten von Iteratoren externe Iteratoren Client... steuert Iteration schaltet auf das nächste Element weiter kann beliebige Funktionalität implementieren interne Iteratoren Client... teilt Iterator eine Operation mit erhält fertiges Ergebnis der Operation zurück Iterator traversiert intern eine Collection 18 / 39

Nulliterator Ein Nulliterator liefert bei hasnext() immer false nützlich für Aggregate, die eigentlich keine Liste enthalten, der Client sie aber behandeln soll, als hätten sie eine Beispiel: Blätterklasse im Composite Muster 19 / 39

Anwendungen implementiert in fast allen OO-Sprachen Java Collection-Framework jede Behälterklasse (ArrayList... ) hat einen Iterator, der java.util.iterator implementiert C#: System.Collections.IEnumerator Klassen die GetEnumerator() implementieren lassen sich mit foreach-konstrukt durchlaufen in Verbindung mit den Mustern Composite (Durchlaufen der Kinder) Memento (Iterator verwendet es, um Schritte einer Iteration zwischenzuspeichern) 20 / 39

Vor - und Nachteile Vorteile Client kann die Elemente eines Aggregates sequentiell traversieren Implementierung des Aggregats muss dem Client nicht bekannt sein Nachteile Entkopplung von Aggregatklasse und Logik zum Iterieren fördert Hohe Kohäsion erhöhte Laufzeit- und Speicherkosten 21 / 39

Beispiel Es folgt ein Beispiel... 22 / 39

Baumstrukturen - Ein neues Problem In der Informatik gibt es viele Konstrukte, die in einer Baumstruktur aufgebaut sind. Beispiele Dateisysteme bestehen aus Verzeichnissen, Dateien Grafiken setzten sich aus geometrischen Objekten zusammen grafische Oberflächen in Java Swing fügen sich aus Frames, Panels, Buttons, Labels etc. zusammen HTML Dokumente werden in einem DOM-Baum organisiert und setzten sich aus Tags zusammen 23 / 39

Gemeinsame Operationen Was jetzt, wenn ein Client auch noch Operationen auf Blätter und Containerklassen ausführen möchte? 24 / 39

Das Composite Entwurfsmuster Für solch einen Anwendungsfall gibt es das Composite Entwurfsmuster! objektbasiertes Strukturmuster erzeugt Baumstrukturen, welche Teil-Ganzes Hierarchien repräsentieren Client kann gemeinsame Operationen auf primitive und zusammengesetzte Objekte ausführen Client kann diese beiden gleich behandeln 25 / 39

Composite Struktur 26 / 39

Teilnehmer - Component eine abstrakte Klasse, welche primitive und zusammengesetzte Klassen repräsentiert dient dem Client als Schnittstelle zur Baumstruktur enthält Methoden, die für Leaf und Composite genutzt werden definiert Methoden zur Kindverwaltung bietet Defaultimplementierung lässt Methodenaufrufe defaultmäßig fehlschlagen (Exception) 27 / 39

Teilnehmer - Component p u b l i c a b s t r a c t c l a s s Component { p u b l i c v o i d add ( Component c ) { throw new U n s u p p o r t e d O p e r a t i o n E x c e p t i o n ( ) ; p u b l i c v o i d remove ( Component c ) { throw new U n s u p p o r t e d O p e r a t i o n E x c e p t i o n ( ) ; p u b l i c Component g e t C h i l d ( i n t i ) throws { throw new U n s u p p o r t e d O p e r a t i o n E x c e p t i o n ( ) ; p u b l i c v o i d o p e r a t i o n ( ) { throw new U n s u p p o r t e d O p e r a t i o n E x c e p t i o n ( ) ; 28 / 39

Teilnehmer - Composite repräsentiert zusammengesetzte Objekte (Behälterklasse) enthält Referenzen auf Kind-Objekte (Leaf oder Composite) führt operation() aus und ruft sie rekursiv bei allen Kindern auf zum Traversieren der Kinder: Iterator Muster 29 / 39

Teilnehmer - Composite p u b l i c c l a s s Composite extends Component { p r i v a t e L i s t <Component> c h i l d r e n ; p u b l i c v o i d add ( Component c ) { / B l a t t anhängen / p u b l i c v o i d remove ( Component c ) { / B l a t t l ö s c h e n / p u b l i c Component g e t C h i l d ( i n t i ) { r e t u r n c h i l d r e n. g e t ( i ) ; p u b l i c v o i d o p e r a t i o n ( ) { / E i g e n e I n s t r u k t i o n e n a u s f ü h r e n und r e k u r s i v b e i a l l e n Kindern a u f r u f e n / 30 / 39

Teilnehmer - Leaf repräsentiert ein primitives Blattobjekt kann keine Kinder enthalten implementiert das gewünschte Blattverhalten bei Aufruf von operation() p u b l i c c l a s s L e a f extends Component { p u b l i c v o i d o p e r a t i o n ( ) { / g ewünschtes V e r h a l t e n / 31 / 39

Teilnehmer - Client baut mit der Schnittstelle der abstrakten Componentklasse den Baum auf nutzt Component als Typ für Leaf - und Composite-Objekte Leaf und Composite können gleich behandelt werden Component c1 = new Composite ( ) ; Component c2 = new L e a f ( ) ; c1. add ( c2 ) ; c1. o p e r a t i o n ( ) ; c2. o p e r a t i o n ( ) ; 32 / 39

Verantwortlichkeit von Component Composite Muster verstößt auf den ersten Blick gegen das objektorientierte Entwurfsprinzip der Hohen Kohäsion (Yoda) ein Kompromiss sollte eingegangen werden werden Blätter als Composite-Objekte, die keine Kinder enthalten, angesehen, wirds besser! Transparenz für den Client ist wichtiger als Sicherheit beim Methodenaufruf unsinnige Methodenaufrufe sind möglich! daher: Exceptions in Defaultimplementierung werfen 33 / 39

Implementierungstipps abstrakte Component Klasse als Schnittstelle arbeiten lassen Leaf und Composite Methoden in dieser Schnittstelle deklarieren Datenstruktur für Kinder in Composite Klasse nicht in Component 34 / 39

Anwendungen Java AWT/Swing Oberflächenkomponenten alle GUI Elemente erben von einer abstrakten Komponentenklasse namens Container Beziehung zu anderen Mustern Visitor Decorator Command (Verschachtelung von Commandos) 35 / 39

Vor - und Nachteile Vorteile Blätter- und Behälterklassen können gleich behandelt werden gemeinsame Operationen auf komplette Baumstruktur anwendbar Nachteile neue Leaf und Composite Objekte lassen sich leicht hinzufügen Entwurf kann zu allgemein werden entstehende Komponenten eines Kompositums lassen sich nicht einschränken 36 / 39

Beispiel Es folgt ein Beispiel... 37 / 39

Quellenangaben Eric Freeman, Elisabeth Freemann u.a. Entwurfsmuster von Kopf bis Fuß O Reilly 2006, ISBN 3-89721-421-0 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides Entwurfsmuster: Elemente wiederverwendbarer objektorientierter Software Addison Wesley 1996, ISBN 3-89319-950-0 38 / 39

Vielen Dank für die Aufmerksamkeit Haben Sie noch Fragen? Download der Präsentation: http://www.alex-rausch-online.de 39 / 39