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.
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}