Design Patterns Handbook
  • Introduction
  • Creational Patterns
    • Builder
    • Factory
    • Abstract Factory
    • Factory Method
    • Prototype
    • Singleton
    • Object Pool
    • Revealing Constructor
  • Structural Patterns
    • Adapter
    • Composite
    • Proxy
    • Flyweight
    • Facade
    • Bridge
    • Decorator
    • Private Class Data
  • Behavioral Patterns
    • Template Method
    • Mediator
    • Chain Of Responsibility
    • Observer
    • Strategy
    • Command
    • State
    • Visitor
    • Memento
    • Interpreter
    • Null Object
    • Iterator
    • Middleware
  • Clean Code Patterns
    • Extract Method
    • Clarify Responsibility
    • Remove Duplications
    • Keep Refactoring
    • Always Unit Test
    • Create Data Type
    • Comment to Better Name
    • Consistent Naming
    • If-else over ternary operator
    • Composition over Inheritance
    • Too Many Returns
    • Private to Interface
  • Anti Patterns
    • Big Ball of Mud
    • Singleton
    • Mad Scientist
    • Spaghetti Code
    • It Will Never Happen
    • Error Codes
    • Commented Code
    • Abbreviations
    • Prefixes
    • Over Patternized
    • Generic Interface over Function
Powered by GitBook
On this page
  • Example - Iterating through collection
  • Example - Accessing database rows

Was this helpful?

  1. Behavioral Patterns

Iterator

Iterator patterns provide way to access collection elements in sequential way.

Example - Iterating through collection

We are going to implement our own iterator to to iterate. This way we will practice iterator pattern and see how an iterator can be created.

interface Iterator<T> {
    boolean hasNext();
    T getNext();
}

class IteratorImpl<T> implements Iterator {

    private java.util.Iterator<T> values;

    public IteratorImpl(List<T> values) {
        this.values = values.iterator();
    }

    public boolean hasNext() {
        return values.hasNext();
    }

    public T getNext() {
        return values.next();
    }
}

// we could add Iterable interface and would define iterator() method
class UserCollection {

    private List<User> users = new ArrayList<>();

    public void add(User user) {
        users.add(user);
    }

    public Iterator<User> iterator() {
        return new IteratorImpl<>(users);
    }
}

class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String toString() {
        return name;
    }
}

Here is how we could use this iterator.

UserCollection users = new UserCollection();
users.add(new User("John"));
users.add(new User("Jimmy"));

Iterator<User> iterator = users.iterator();
while (iterator.hasNext()) {
     User user = iterator.getNext();
     System.out.println(user);
}

Example - Accessing database rows

Here we create another iterator to move away from "iterator" keyword. It this case, ResultSet is the iterator.

import java.util.*;

// simplified result set that returns on next string
interface ResultSet {
    String nextString();
    boolean hasNext();
}

class OneRowResultSet implements ResultSet {

    private Queue<String> stack;

    public OneRowResultSet(List<String> values) {
        this.stack = new ArrayDeque<>();
        stack.addAll(values);
    }

    @Override
    public String nextString() {
        return stack.poll();
    }

    @Override
    public boolean hasNext() {
        return !stack.isEmpty();
    }
}

Now we can use result set, fill it with values and iterate through it.

List<String> values = new ArrayList<>();
values.add("A");
values.add("B");
values.add("C");

ResultSet resultSet = new OneRowResultSet(values);

while (resultSet.hasNext()) {
     String value = resultSet.nextString();
     System.out.println(value);
}

The code above goes through all records and prints out the following.

A
B
C
PreviousNull ObjectNextMiddleware

Last updated 5 years ago

Was this helpful?