Entwurfsmuster – Iterator Gina Puzic Der Iterator ist ein Verhaltensmuster. Er ist sowohl Klassen wie auch Objektbasiert.
Übersicht Entwurfsmuster Aufgabe Erzeugung-smuster Struktur-muster Verhaltensmuster Gültigkeits-bereich klassen-basiert Fabrikmethode Adapter Interpreter Schablonen-methode objekt-basiert Abstrakte Fabrik Erbauer Prototyp Singleton Adapter Brücke Dekorierer Fassade Fliegenge-wicht Kompositum Proxy Befehl Beobachter Besucher Iterator Momento Strategie Vermittler Zustand Zuständigkeits-kette Iterator auch bekannt als Cursor. compound=Zusammensetzung(Mischen) Entwurfsmuster Iterator
Zweck Zugriffsmöglichkeit auf eine Sammlung von Daten, ohne dass die darunter liegende Datenstruktur offengelegt wird. Iterator auch bekannt als Cursor. Bsp.Eine Liste von Objekten sollte die Möglichkeit bieten auf ihre Elemente zuzugreifen ohne ihre interne Struktur offenzulegen. Entwurfsmuster Iterator
Motivation Verschiedene Traversierungsalgorithmen auf eine Datenstruktur (z.B. Liste) anwenden können ohne ihre Schnittstelle aufblähen zu müssen. Die Datenstruktur zur selben Zeit mehrfach traversieren können. Die Aggregationsklasse ändern können ohne den Klientcode ändern zu müssen. Verschiedene Traversierungsalgorithmen auf eine Datenstruktur (z.B. Liste) anwenden können ohne ihre Schnittstelle aufblähen zu müssen. Die Datenstruktur zur selben Zeit mehrfach traversieren können. Die Aggregationsklasse ändern können ohne den Klientcode ändern zu müssen. Entwurfsmuster Iterator
return new KonkreterIterator(this) Strukturdiagramm ErzeugeIterator() Aggregat KonkretesAggregat Start() Weiter() IstFertig() AktuellesElement() Iterator KonkreterIterator return new KonkreterIterator(this) Externer Iterator=Iteration vom Klient gesteuert erhöht die Flexibilität. Wird vom Klient gesteuert. Interner Iterator=Iteration vom Iterator selbst gesteuert. Verbirgt die Ausführung der Iteration vom Klient. ErzeugeIterator(): ähnlich wie virtueller Konstruktor(Fabrikmethode), da diese Methode ein Objekt erzeugt und zurückgibt. Entwurfsmuster Iterator
Teilnehmer Iterator KonkreterIterator Aggregat KonkretesAggregat Definiert Schnittstelle für Zugriff und Travesierung von Elementen ConcreteIterator Implementiert Iterator-Schnittstelle Aggregate Definiert eine Schnittstelle zur Erzeugung eines Iterator-Objektes ConcreteAggregate Implementiert die Iterator-Kreationsroutine und gibt eine Instanz von ConcreteIterator zurück Entwurfsmuster Iterator
Beispiel: Liste Trennung des Traversierungsalgorithmus vom Listenobjekt. Liste Anzahl() HaengeAn(Element) Entferne(Element) ….. liste ListenIterator Start() Weiter() IstFertig() AktuellesElemtent() Index Entwurfsmuster Iterator
Beispiel: Liste Polymorphe Iteratoren (Iteration vom Klient gesteuert) Aggregat ErzeugeIterator() Anzahl() HaengeAn(Element) Entferne(Element) … Klient Iterator Start() Weiter() IstFertig() AktuellesElement() Externer Iterator=Iteration vom Klient gesteuert erhöht die Flexibilität. Wird vom Klient gesteuert. Interner Iterator=Iteration vom Iterator selbst gesteuert. Verbirgt die Ausführung der Iteration vom Klient. Liste ListenIterator SkipListe SkipListenIterator Entwurfsmuster Iterator
Beispielcode public interface Iterator{ public boolean hasNext() //Liefert true, falls noch weitere Elemente //verfügbar public Object next() //Liefert das nächste Element zurück public void remove() //Löscht das zuletzt mit next() abgerufenen //Element } Entwurfsmuster Iterator
Beispielcode import java.util.*; public class Beispiel {… //Füllen einer Liste ArrayList list=new ArrayList(); for(int i=0;i<5;i++){ list.add(i); } Entwurfsmuster Iterator
Beispielcode … Iterator it=list.iterator(); while(it.hasNext()){ //Löschen von Elementen mit dem Iterator Iterator it=list.iterator(); while(it.hasNext()){ String s=(String) it.next(); if(s=="abc"){ it.remove(); } Entwurfsmuster Iterator
Beispielcode … while(it.hasNext()){ //Ausgeben aller Elemente while(it.hasNext()){ System.out.println((String) it.next()); } Entwurfsmuster Iterator
Robustheit des Iterators Probleme beim Ändern des Aggregats während der Traversierung. Lösung 1: Kopieren des Aggregats zu teuer Lösung 2: Einen robusten Iterator verwenden z.B. Benutzung des Observer Patterns Ein Hauptproblem: Der Iterator zeigt auf ein Element, das gelöscht wird. Entwurfsmuster Iterator
Umsetzung mit Observer Aggregat = Subjekt Iterator = Beobachter Änderung des Aggregats: Iterator wird benachrichtigt die update-Methode wird aufgerufen Probleme in Sprachen ohne Garbage Collector: Iterator muss vom Stack gelöscht (delete) werden Entwurfsmuster Iterator
Literaturverzeichnis Entwurfsmuster: Elemente wiederverwendbarer objektorientierter Software Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Entwurfsmuster Iterator