반복자 패턴이란, 특정한 데이터 집합에 순차적인 접근을 지원하는 행위 패턴
일반적인 데이터 집합인 배열이나 List 같은 집합은 for문을 통해서 간단하게 순회 가능
하지만, 해시 트리처럼 데이터의 순서가 정해지지 않고 저장되는 컬렉션들을 순회하는 기준이 애매하다.
이러한 복잡한 컬렉션들을 순회하는 전략을 정의하는 것이 Iterator 패턴 이다.
추가적으로 Iterator를 통한 순회는 내부 구조를 노출시키지 않는다는 장점도 있다
정해진 데이터 집합은 데이터를 조회할 수 있도록 Iterator 인터페이스를 상속받는 객체를 제공한다.
Iterator 인터페이스는 각각의 필드 정보를 소유 하고 있다
public static void main(String[] args) {
// 1. 게시판 생성
Board board = new Board();
// 2. 게시판에 게시글을 포스팅
board.addPost("디자인 패턴 강의 리뷰", LocalDate.of(2020, 8, 30));
board.addPost("게임 하실분", LocalDate.of(2020, 2, 6));
board.addPost("이거 어떻게 하나요?", LocalDate.of(2020, 6, 1));
board.addPost("이거 어떻게 하나요?", LocalDate.of(2021, 12, 22));
List<Post> posts = board.getPosts();
// 3. 게시글 발행 순서대로 조회하기
for (int i = 0; i < posts.size(); i++) {
Post post = posts.get(i);
System.out.println(post.title + " / " + post.date);
}
// 4. 게시글 날짜별로 조회하기
Collections.sort(posts, (p1, p2) -> p1.date.compareTo(p2.date)); // 집합체를 날짜별로 정렬
for (int i = 0; i < posts.size(); i++) {
Post post = posts.get(i);
System.out.println(post.title + " / " + post.date);
}
}
// 게시판
class Board {
// 게시글을 리스트 집합 객체로 저장 관리
List<Post> posts = new ArrayList<>();
public void addPost(String title, LocalDate date) {
this.posts.add(new Post(title, date));
}
public List<Post> getPosts() {
return posts;
}
// ListPostIterator 이터레이터 객체 반환
public Iterator<Post> getListPostIterator() {
return new ListPostIterator(posts);
}
// DatePostIterator 이터레이터 객체 반환
public Iterator<Post> getDatePostIterator() {
return new DatePostIterator(posts);
}
}
public static void main(String[] args) {
// 1. 게시판 생성
Board board = new Board();
// 2. 게시판에 게시글을 포스팅
board.addPost("디자인 패턴 강의 리뷰", LocalDate.of(2020, 8, 30));
board.addPost("게임 하실분", LocalDate.of(2020, 2, 6));
board.addPost("이거 어떻게 하나요?", LocalDate.of(2020, 6, 1));
board.addPost("이거 어떻게 하나요?", LocalDate.of(2021, 12, 22));
// 게시글 발행 순서대로 조회하기
print(board.getListPostIterator());
// 게시글 날짜별로 조회하기
print(board.getDatePostIterator());
}
public static void print(Iterator<Post> iterator) {
Iterator<Post> itr = iterator;
while(itr.hasNext()) {
Post post = itr.next();
System.out.println(post.title + " / " + post.date);
}
}