Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Entwurfsmuster - Iterator
Jens Spinner (279215)
HTWG Konstanz
7. Mai 2009
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Muster Klassifikation
objektbasiertes Verhaltensmuster
Zweck des Patterns
Erm¨ogliche den sequentiellen Zugriff auf die Elemente eines zusammengestzten Objekts, ohne seine zugrundeligende Repr¨asentation offenzulegen.
Iteration?
v. lat. iterare “wiederholen”
Jens Spinner (279215) Entwurfsmuster - Iterator
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
B¨ose Trennung polymorphe Iteratoren Fabrikmethode
Abbildung:B¨ose Klasse
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
B¨ose Trennung polymorphe Iteratoren Fabrikmethode
1. Trennung des Traversierungsmechanismus
Trennung des Traversierungsmechanismus vom Listenobjekt. Es besteht eine Kopplung.
Abbildung: iterator Klassendiagramm
Verbessernung
Trennung erm¨oglicht es, Iteratoren f¨ur unterschiedliche
Traversierungsarten zu erstellen ohne die Listenschnittstelle zu vergr¨oßern.
Jens Spinner (279215) Entwurfsmuster - Iterator
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
B¨ose Trennung polymorphe Iteratoren Fabrikmethode
2. erweiterung polymorphe Iteratoren
Einf¨uhrung einer AbstraktListe und AbstrakIterator Schnittstelle.
Dadurch kann auf die Liste und den Iterator einheitlich zugegriffen werden.
Abbildung: iterator Klassendiagramm
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
B¨ose Trennung polymorphe Iteratoren Fabrikmethode
3. erweiterung um Fabrikmethode
“Da wir nur solchen Code schreiben wollen, der von den konkreten Unterklassen unabh¨angig ist, k¨onnen wir kein Objekt einer
bestimmten Unterklasse erzeugen. Statt dessen machen wir die Listenobjekte daf¨ur zust¨andig, ihre entsprechenden Iteratoren zu erzeugen.” [GAMMA]
Abbildung: iterator Klassendiagramm
Jens Spinner (279215) Entwurfsmuster - Iterator
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Wozu?
um auf element zugreifen, ohne interne Struktur offenzulegen um auf verschieden Arten zu traversieren
um zu vermeiden, dass durch verschiedene Traversierungsarten die Schnittstelle z.B.: einer Listenklasse aufgebl¨aht wird (vorw¨arts, r¨uckw¨arts...)
um eine einheitliche Schnittstelle zur Traversierung zu erhalten (polymorphie)
um mehrfach zu traversieren
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Teilnehmer Extern vs. Intern Robustheit Nulliterator
Iterator
definiert eine Schnittstelle zum Zugriff auf und zur Traversierung von Elementen
KonktreterIterator
implementiert die Schnittstelle von Iterator
verwaltet die aktuelle Position w¨ahrend der Traversierung des Aggregats
Aggregat
definiert eine Schnittstelle zum Erzeugen eines Objekts der Klasse Iterator
KonkretesAggregat
implementiert die Operation zum Erzeugen eines konkreten Iterators, in dem es ein Objekt der passenden
KonkreterIterator-Klasse zur¨uckgibt [GAMMA]
Jens Spinner (279215) Entwurfsmuster - Iterator
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Teilnehmer Extern vs. Intern Robustheit Nulliterator
Extern
Wenn der Klient die Iteration Steuert. Klienten m¨ussen die Traversierung selbst vorantreiben.
Intern
Wenn der Iterator die Iteration Steuert.
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Teilnehmer Extern vs. Intern Robustheit Nulliterator
externer Iterator - Klientensicht
for (Iterator i = c.iterator(); i.istFertig(); ){ . Typ elem = (Typ) i.next();
}
erweitertes for:
for (Typ elem : c) ...
Jens Spinner (279215) Entwurfsmuster - Iterator
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Teilnehmer Extern vs. Intern Robustheit Nulliterator
class MyObjectHandler implements ObjectHandler { public void handle(Object o) {
System.out.println(o);
} }
// - Klientensicht
Object[] myList = new Object[] {new Integer(1), new Integer(2), new Integer(3)};
MyObjectIterator iterator = new MyObjectIterator(myList);
iterator.print();
iterator.apply(new MyObjectHandler());
[WIKIPEDIA]
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Teilnehmer Extern vs. Intern Robustheit Nulliterator
Problem
Wenn Element dem Aggregat hinzugef¨ugt oder entfernt werden, kann es passieren, dass ein Element doppelt gelesen oder verpasst wird
L¨osung
Bsp.: registrieren des Iterators beim Aggregat - Zustandsanpassung des Iterators (Beobachtermuster - Iterator ist Beobachter,
Aggregat das Subjekt)
Jens Spinner (279215) Entwurfsmuster - Iterator
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Teilnehmer Extern vs. Intern Robustheit Nulliterator
Was?
degenerierter Iterator, der f¨ur die Handhabung von
Grenzbedingungen n¨utzlich ist. Nulliterator ist immer am “Ende”
(IstFertig immer TRUE).
Anwendung
Blattelemente geben Nulliterator zur¨uck.
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Verwandtschaft Vergleich
Kompositum
Iteratoren werden oft auf rekursive Strukturen wie Komposita angewendet.
Fabrikmethode
Polymorphe Iteratoren st¨utzen sich auf Fabrikmethoden ab, um ein Objekt der richtigen Iteratorunterklasse zu erzeugen.
Memento
Ein Iterator kann ein Memento benutzen, um den Zustand einer Iteration zwischenzuspeichern. Der Iterator speichert das Memento dann intern.
Jens Spinner (279215) Entwurfsmuster - Iterator
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Verwandtschaft Vergleich
Iterator Pattern ¨ahnlich dem Memento Pattern in der Art, wie sie ein Aggregatobject kapseln. Diese Muster ziehen den Zustand aus dem Objekt heraus und verwalten diesen mit ihrer Logik.
[LASATER]
Einf¨uhrung Schritte zum Pattern nach GAMMA Zweck Implementierung Verwandte Muster
Verwandtschaft Vergleich
Entwurfsmuster, GAMMA
Design Patterns, Christopher Lasater Wikipedia
ENDE
Jens Spinner (279215) Entwurfsmuster - Iterator