티스토리 뷰
728x90
1. 이터레이터 패턴?
- 집합 객체의 내부 구조를 노출시키지 않고 순회하는 방법을 제공하는 패턴.
2. 이터레이터 패턴 적용
2.1. 적용 전 코드
- 클라이언트가 Board클래스 내부의 Post에 대해 너무 많은 것을 알고있음.
- 내부 Post의 타입이 변경될시 클라이언트 코드도 같이 변경되어야 함.
public class IteratorClient {
public static void main(String[] args) {
Board board = new Board();
board.addPost("디자인 패턴 게임");
board.addPost("선생님, 저랑 디자인 패턴...");
board.addPost("지금 이자리에 계신 여러분들은 모두...");
//TODO 들어간 순서대로 순회하기
List<Post> posts = board.getPosts();
for (int i = 0; i < posts.size(); i++) {
Post post = posts.get(i);
System.out.println(post.getContents());
}
//TODO 최신글 먼저 순회하기
Collections.sort(posts, (p1, p2) -> p2.getCreatedAt().compareTo(p1.getCreatedAt()));
for (int i = 0; i < posts.size(); i++) {
Post post = posts.get(i);
System.out.println(post.getContents());
}
}
}
2.2. 적용후 코드
2.2.1. Post 들어간 순서대로 순회하기
- Post의 직접 접근이 아닌 Post의 iterator를 반환하여 사용하도록 한다.
public class Board {
private List<Post> posts;
public void addPost(String post) {
if (this.posts == null) {
this.posts = new ArrayList<>();
}
this.posts.add(new Post(post));
}
public Iterator<Post> getDefaultPostIterator() {
return this.posts.iterator();
}
}
public class IteratorClient {
public static void main(String[] args) {
Board board = new Board();
board.addPost("디자인 패턴 게임");
board.addPost("선생님, 저랑 디자인 패턴...");
board.addPost("지금 이자리에 계신 여러분들은 모두...");
// 들어간 순서대로 순회하기
Iterator<Post> postIterator = board.getDefaultPostIterator();
while (postIterator.hasNext()) {
System.out.println(postIterator.next().getContents());
}
}
}
2.2.2. 최신글 먼저 순회하기
- 최신글을 순회하도록 하는 커스텀 이터레이터 클래스를 생성한다.
public class RecentPostIterator implements Iterator<Post> {
private final Iterator<Post> innerIterator;
public RecentPostIterator(List<Post> posts) {
Collections.sort(posts, (p1, p2) -> p2.getCreatedAt().compareTo(p1.getCreatedAt()));
this.innerIterator = posts.iterator();
}
@Override
public boolean hasNext() {
return this.innerIterator.hasNext();
}
@Override
public Post next() {
return this.innerIterator.next();
}
}
public class Board {
private List<Post> posts;
public void addPost(String post) {
if (this.posts == null) {
this.posts = new ArrayList<>();
}
this.posts.add(new Post(post));
}
public Iterator<Post> getRecentPostIterator() {
return new RecentPostIterator(this.posts);
}
}
public class IteratorClient {
public static void main(String[] args) {
Board board = new Board();
board.addPost("디자인 패턴 게임");
board.addPost("선생님, 저랑 디자인 패턴...");
board.addPost("지금 이자리에 계신 여러분들은 모두...");
// 최신글 먼저 순회하기
Iterator<Post> recentPostIterator = board.getRecentPostIterator();
while (recentPostIterator.hasNext()) {
System.out.println(recentPostIterator.next().getContents());
}
}
}
3. 장점 및 단점
3.1. 장점
- 집합 객체가 가지고있는 객체들을 손쉽게 접근할 수 있다.
- 일관된 인터페이스를 사용하여 여러형태의 집합 객체를 순회 할 수 있다.
3.2. 단점
- 구조가 복잡해진다.
728x90
'디자인 패턴' 카테고리의 다른 글
18. 메멘토 패턴 (0) | 2022.02.10 |
---|---|
17. 중재자 패턴 (0) | 2022.02.10 |
15. 인터프리터 패턴 (0) | 2022.02.10 |
14. 커맨드 패턴 (0) | 2022.02.10 |
13. 책임연쇄패턴 (0) | 2022.02.10 |
댓글