Design patterns

patterns16IteratorPattern

Path
pkg8patterns/patterns16IteratorPattern.java
Package
pkg8patterns
Study order
16
Run
Single-file source launch
Command
java pkg8patterns/patterns16IteratorPattern.java

There is no in-browser runner. This is the file from the curriculum, unchanged.

pkg8patterns/patterns16IteratorPattern.java
1package pkg8patterns;2 3/*4 * Iterator (Behavioral)5 * ---------------------6 * INTENT: provide a way to access elements of an aggregate sequentially without7 *         exposing its underlying representation.8 * UML: Iterable + iterator(): Iterator ; Iterator + hasNext()/next().9 * PROS: uniform traversal; multiple simultaneous iterations.10 * CONS: trivial for arrays/lists (built-in).11 * REAL-WORLD: java.util.Iterator, the for-each loop.12 */13import java.util.*;14 15public class patterns16IteratorPattern {16 17    // Custom aggregate with its own iterator18    static class RingBuffer<T> implements Iterable<T> {19        private final List<T> items = new ArrayList<>();20        void add(T item) { items.add(item); }21 22        public Iterator<T> iterator() {23            return new Iterator<>() {24                private int index = 0;25                public boolean hasNext() { return index < items.size(); }26                public T next() {27                    if (!hasNext()) throw new NoSuchElementException();28                    return items.get(index++);29                }30            };31        }32    }33 34    public static void main(String[] args) {35        RingBuffer<String> rb = new RingBuffer<>();36        rb.add("a"); rb.add("b"); rb.add("c");37 38        // Works with for-each because it is Iterable39        for (String s : rb) System.out.print(s + " ");40        System.out.println();41 42        // Manual iteration43        Iterator<String> it = rb.iterator();44        while (it.hasNext()) System.out.print(it.next().toUpperCase() + " ");45        System.out.println();46    }47}