Iterator Design Pattern
Aliases π: None
Description π: It provides a way to iterate something and access its child elements.
Advantages β
- Simplified Iteration
 
Disadvantages π«
- May be complicated if we need to edit iterated elements
 
Notes π
- None
 
Java Implementation
Assuming we got a bunch of elements:
public interface Item {}
public class ItemA implements Item {}
public class ItemB implements Item {}
And a container Bag that we want to iterate:
public class Main {
    public static void main(String[] args) {
        Bag bag = new Bag(new ItemA(), new ItemB(), new ItemA());
        for (Item item: bag) {
            System.out.println(item);
        }
    }
}
Then in Java, we would have to implement Iterable<T> and in some scenarios, we may have to create our own Iterator<T>.
import java.util.Iterator;
import java.util.NoSuchElementException;
public class Bag implements Iterable<Item> {
    private final Item[] items;
    public Bag(Item... items) {
        this.items = items;
    }
    @Override
    public Iterator<Item> iterator() {
        return new BagIterator(this);
    }
    // iterator of my Sac
    private static class BagIterator implements Iterator<Item> {
        private int current;
        private final Bag bag;
        public BagIterator(Bag bag) {
            this.bag = bag;
            this.current = -1; // starts right before 0
        }
        @Override // do we have a next ?
        public boolean hasNext() { return this.current+1 < this.bag.items.length; }
        @Override
        public Item next() {
            // the documentation says that we must throw NoSuchElementException
            if(!hasNext()) throw new NoSuchElementException("no such elements");
            this.current++;
            return this.bag.items[this.current];
        }
    }
}