Iterator Design Pattern Alessandro Soro Sylvain Giroux
Plan But et Motivation Structure et implémentation Exemple Conclusion Références
But et motivation Problèmes – Fournir une façon de parcourir un objet aggrégé de manière indépendante de son implémentation. – Permettre différents parcours des objets aggrégés – Fournir une interface uniforme pour parcourir diverses structures aggrégées, Supporter l’itération polymorphique Solution – Extraire la responsabilité pour les accès et les parcours et la donner à un objet iterator.
Structure
Participants Aggregate: – Interface standard pour créer les objets Iterator. ConcreteAggregate: – Implémente createIterator() qui rend une instance de l’itérateur concret (ConcreteIterator). Iterator: – Définit une interface pour accéder et parcourir les éléments. ConcreteIterator: – Implémente Iterator, connaît les détails interne de ConcreteAggregate.
Problèmes d’implémentation Qui contrôle l’itération? – le client external iterator – iterator internal iterator Où est défini l’algorithme de parcours? – dans Iterator solution la plus commune, il est ainsi facile d’avoir plus qu’une technique de parcours – Dans l’aggrégat Iterator ne conserve que l’état de l’itération (cursor) Accès concurrent aux objets aggregate. – Un itérateur qui permet des modifications parallèles sans faire une copie de la structure est dit robuste Opérations supplémentaires – Previous() – SkipTo(); Index() – Remove(); Replace()
Exemple public abstract class AbstractList extends AbstractCollection implements List { private class Itr implements Iterator { //voir page suivante } public int size() {... } abstract public Object get(int index); public Iterator iterator() { return new Itr(); }
Exemple private class Itr implements Iterator { int cursor = 0; int lastRet = -1; int expectedModCount = modCount; public boolean hasNext() { return cursor != size(); } public Object next() { try {Object next = get(cursor); checkForComodification(); lastRet = cursor++; return next; } catch(IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); }... }
Exemple private class Itr implements Iterator {.... public void remove() { if (lastRet==-1) throw new IllegalStateException(); checkForComodification(); try { AbstractList.this.remove(lastRet); if (lastRet<cursor) cursor--; lastRet=-1; expectedModCount=modCount; } catch (IndexOutOfBoundsException e) { throw new ConcurrentModificationException(); } private final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); }
Exemple d’utilisation java.util.Collection c = new java.util.ArrayList(); c.add(new String("uno")); c.add(new String("due")); c.add(new String("tre")); java.util.Iterator i = c.iterator(); while (i.hasNext()) { System.out.println(i.next().toString()); }
Conclusion Usages connus – interface java.util.Enumerator. – interface Java 2 Collections Framework Iterator Iterators – Similar to the familiar Enumeration interface,Enumeration – but more powerful, and with improved method names. – Iterator – Iterator In addition to the functionality of the Enumeration interface, allows the user to remove elements from the backing collection with well defined, useful semantics. – ListIterator – ListIterator Iterator for use with lists. In addition to the functionality of the Iterator interface, supports bi-directional iteration, element replacement, element insertion and index retrieval.
Conclusion Patrons de conception reliés – Factory method itérateurs polymorphiques – Composite pour parcours récursivement des structures composites – Visitor pour appliquer une opération à chaque membre d’une structure – Memento pour sauver l’état d’une itération
Références Design Patterns: Elements of Reusable Object-Oriented Software Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides The Iterator Pattern Design Patterns In Java Bob Tarr The collection framework – /index.html /index.html