Entwurfsmuster – Iterator

Download Report

Transcript Entwurfsmuster – Iterator

Entwurfsmuster – Iterator
Gina Puzic
Übersicht Entwurfsmuster
Aufgabe
Entwurfsmuster
Erzeugungsmuster
klassenbasiert
Gültigkeits
-bereich
objektbasiert
Entwurfsmuster Iterator
Strukturmuster
Verhaltensmuster
Fabrikmethode
Adapter
Interpreter
Schablonenmethode
Abstrakte Fabrik
Erbauer
Prototyp
Singleton
Adapter
Brücke
Dekorierer
Fassade
Fliegengewicht
Kompositum
Proxy
Befehl
Beobachter
Besucher
Iterator
Momento
Strategie
Vermittler
Zustand
Zuständigkeitskette
2
Zweck
Zugriffsmöglichkeit auf eine Sammlung von
Daten, ohne dass die darunter liegende
Datenstruktur offengelegt wird.
Entwurfsmuster Iterator
3
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.
Entwurfsmuster Iterator
4
Strukturdiagramm
Aggregat
ErzeugeIterator()
Iterator
Start()
Weiter()
IstFertig()
AktuellesElement()
KonkretesAggregat
KonkreterIterator
ErzeugeIterator()
return new KonkreterIterator(this)
Entwurfsmuster Iterator
5
Teilnehmer
Iterator
KonkreterIterator
Aggregat
KonkretesAggregat
Entwurfsmuster Iterator
6
Beispiel: Liste
Trennung des Traversierungsalgorithmus vom
Listenobjekt.
Liste
Anzahl()
HaengeAn(Element)
Entferne(Element)
…..
liste
ListenIterator
Start()
Weiter()
IstFertig()
AktuellesElemtent()
Index
Entwurfsmuster Iterator
7
Beispiel: Liste
Polymorphe Iteratoren (Iteration vom Klient
gesteuert)
Iterator
Klient
Aggregat
ErzeugeIterator()
Anzahl()
HaengeAn(Element)
Entferne(Element)
…
Liste
SkipListe
Entwurfsmuster Iterator
Start()
Weiter()
IstFertig()
AktuellesElement()
ListenIterator
SkipListenIterator
8
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
9
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
10
Beispielcode
…
//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
11
Beispielcode
…
//Ausgeben aller Elemente
while(it.hasNext()){
System.out.println((String)
it.next());
}
Entwurfsmuster Iterator
12
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
Entwurfsmuster Iterator
13
Umsetzung mit Observer
Aggregat = Subjekt
Iterator = Beobachter
Änderung des Aggregats:
• Iterator wird benachrichtigt
• die update-Methode wird aufgerufen
Entwurfsmuster Iterator
14
Literaturverzeichnis
Entwurfsmuster: Elemente wiederverwendbarer
objektorientierter Software Erich Gamma,
Richard Helm, Ralph Johnson, John Vlissides.
Entwurfsmuster Iterator
15