Iterator Pattern
- 객체의 내부 구현을 외부에 노출하지 않고 집합체의 모든 항목에 대한 접근이 가능하도록 설계
- 여러 리스트에 대해 동일한 방식으로 순회할 수 있는 인터페이스와 기능 제공
- 집합체는 순회에 대한 구현을 하지 않아도 됨
- 단일 역할의 원칙
코드
- Iterator
public interface Iterator { public boolean hasNext(); public Object next(); }
- Aggregate(IterableCollection)
public interface Aggregate { public int getLength(); public Iterator iterator(); }
- concreteCollection
public class BookShelf implements Aggregate{ private Book[] books; private int last = 0; public BookShelf(int maxSize){ this.books = new Book[maxSize]; } .......... @Override public Iterator iterator() { return new BookShelfIterator(this); } }
- concreteIterator
public class BookShelfIterator implements Iterator{ private BookShelf list; private int index = 0; public BookShelfIterator(Aggregate list) { this.list = (BookShelf) list; } @Override public boolean hasNext() { if(index < list.getLength()) { return true; } return false; } @Override public Object next() { Book book = list.getAt(index); index++; return book; } }
장단점
장점
1.단일책임원칙: 부피가 큰 순회 알고리즘들을 별도의 클래스들로 추출하여 클라이언트 코드와 컬렉션들을 정돈할 수 있다
2.개방폐쇄의원칙: 새로운 유형의 컬렉션들과 반복자들을 구현할 수 있으며 이들을 아무 것도 훼손하지 않고 기존의 코드에 전달할 수 있음
3.컬렉션을 병렬로 순회: 각 반복자 객체에는 자신의 고유한 순회 상태가 포함되어 있기 때문
단점
1. 단순한 컬렉션들과 작동하는 경우 반복자 패턴을 적용하는 것은 과도할 수 있음
- 일부 특수 컬렉션들의 요소들을 직접 탐색하는 것보다 덜 효율적일 수 있음
정리
BookShelf클래스에서iterator메서드로return new BookShelfIterator하는 것이 옵저버 패턴과 코드 구조가 비슷하다고 느껴졌다. observer-subject와 concretecollection -concreteIterator의 관계성 때문이다. observer와 concretecollection 둘 다 메서드로 subject, concreteIterator의 기능을 가져다 쓰는 것이 닮아 있다.출처
이 글은 인프런 박은종 강사님의 강의 내용을 정리하기 위하여 작성하였습니다.