2923. Design Pattern - IteratorIterator Pattern
Behavioral Pattern: Iterator Pattern.
1. Iterator Pattern
The Iterator pattern is used to get a way to access the elements of a collection object in sequential manner without any need to know its underlying representation. This pattern is widely used in Java Collection Framework. Iterator interface provides methods for traversing through a collection.
2. Example
2.1 Course
public class Course {
    private String title;
    private int credit;
    public Course(String title, int credit) {
        this.title = title;
        this.credit = credit;
    }
    public String getTitle() {
        return this.title;
    }
    public int getCredit() {
        return this.credit;
    }
    @Override
    public String toString() {
        return "Course {" +
                "title='" + title + '\'' +
                ", credit=" + credit +
                '}';
    }
}
2.2 Iterator
public interface CourseIterator {
    public boolean hasNext();
    public Course next();
}
public class CourseIteratorImpl implements CourseIterator {
    private List<Course> courses;
    private int index;
    public CourseIteratorImpl(List<Course> courseList) {
        this.courses = courseList;
    }
    @Override
    public boolean hasNext() {
        return index < courses.size();
    }
    @Override
    public Course next() {
        if (index < 0 || index >= courses.size()) {
            return null;
        } else {
            Course c = courses.get(index);
            index++;
            return c;
        }
    }
}
2.3 Collection
public interface CourseCollection {
    public void add(Course c);
    public void remove(Course c);
    public CourseIterator iterator();
}
public class CourseCollectionImpl implements CourseCollection {
    private List<Course> courses;
    public CourseCollectionImpl() {
        courses = new ArrayList<>();
    }
    public void add(Course c) {
        this.courses.add(c);
    }
    public void remove(Course c) {
        this.courses.remove(c);
    }
    @Override
    public CourseIterator iterator() {
        return new CourseIteratorImpl(this.courses);
    }
}
2.4 Client
public class Client {
    public void run() {
        CourseCollection courses = new CourseCollectionImpl();
        courses.add(new Course("Algorithms and Structures", 5));
        courses.add(new Course("Database Technologies", 4));
        courses.add(new Course("Mobile App Development", 3));
        courses.add(new Course("Mining Big Data", 5));
        CourseIterator iterator = courses.iterator();
        while (iterator.hasNext()) {
            Course c = iterator.next();
            System.out.println(c.toString());
        }
    }
}
Output
Course {title='Algorithms and Structures', credit=5}
Course {title='Database Technologies', credit=4}
Course {title='Mobile App Development', credit=3}
Course {title='Mining Big Data', credit=5}