728x90
반응형
Iterator Pattern
집합 객체 내부 구조를 노출시키지 않고 순회하는 방법을 제공하는 패턴
집합 객체를 순회하는 클라이언트 코드를 변경하지 않고 다양한 순회 방법을 제공할 수 있다.
BEFORE
Client
public class Client {
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.getTitle());
}
// TODO 가장 최신 글 먼저 순회하기
Collections.sort(posts, (p1, p2) -> p2.getCreatedDateTime().compareTo(p1.getCreatedDateTime()));
for (int i = 0 ; i < posts.size() ; i++) {
Post post = posts.get(i);
System.out.println(post.getTitle());
}
}
}
==========================================================================
[실행결과]
디자인 패턴 게임
선생님, 저랑 디자인 패턴 하나 학습하시겠습니까?
지금 이 자리에 계신 여러분들은 모두 디자인 패턴을 학습하고 계신 분들입니다.
지금 이 자리에 계신 여러분들은 모두 디자인 패턴을 학습하고 계신 분들입니다. // 여기부터 역순으로 출력
선생님, 저랑 디자인 패턴 하나 학습하시겠습니까?
디자인 패턴 게임
Board
public class Board {
List<Post> posts = new ArrayList<>();
public List<Post> getPosts() {
return posts;
}
public void setPosts(List<Post> posts) {
this.posts = posts;
}
public void addPost(String content) {
this.posts.add(new Post(content));
}
}
Post
public class Post {
private String title;
private LocalDateTime createdDateTime;
public Post(String title) {
this.title = title;
this.createdDateTime = LocalDateTime.now();
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public LocalDateTime getCreatedDateTime() {
return createdDateTime;
}
public void setCreatedDateTime(LocalDateTime createdDateTime) {
this.createdDateTime = createdDateTime;
}
}
AFTER
Client
public class Client {
public static void main(String[] args) {
Board board = new Board();
board.addPost("디자인 패턴 게임");
board.addPost("선생님, 저랑 디자인 패턴 하나 학습하시겠습니까?");
board.addPost("지금 이 자리에 계신 여러분들은 모두 디자인 패턴을 학습하고 계신 분들입니다.");
// TODO 들어간 순서대로 순회하기
List<Post> posts = board.getPosts();
Iterator<Post> iterator = posts.iterator();
System.out.println(iterator.getClass());
for (int i = 0 ; i < posts.size() ; i++) {
Post post = posts.get(i);
System.out.println(post.getTitle());
}
// TODO 가장 최신 글 먼저 순회하기
Iterator<Post> recentPostIterator = board.getRecentPostIterator();
while(recentPostIterator.hasNext()) {
System.out.println(recentPostIterator.next().getTitle());
}
}
}
Board
public class Board {
List<Post> posts = new ArrayList<>();
public List<Post> getPosts() {
return posts;
}
public void addPost(String content) {
this.posts.add(new Post(content));
}
public Iterator<Post> getRecentPostIterator() {
return new RecentPostIterator(this.posts);
}
}
RecentPostIterator
public class RecentPostIterator implements Iterator<Post> {
private Iterator<Post> internalIterator;
public RecentPostIterator(List<Post> posts) {
Collections.sort(posts, (p1, p2) -> p2.getCreatedDateTime().compareTo(p1.getCreatedDateTime()));
this.internalIterator = posts.iterator();
}
@Override
public boolean hasNext() {
return this.internalIterator.hasNext();
}
@Override
public Post next() {
return this.internalIterator.next();
}
}
[패턴 복습]
장점 | 단점 |
- 집합객체가 가지고 있는 객체들에 손쉽게 접근할 수 있다. - 일관된 인터페이스를 사용해 여러 형태의 집합 구조를 순회할 수 있다. |
- 클래스가 늘어나고 복잡도가 증가한다. |
[실무에서 쓰이는 경우]
- 자바
- java.util.Enumeration과 java.util.Iterator
- Java StAX(Streaming API for XML)의 Iterator 기반 API
- XmlEventReader, XmlEventWriter
- 스프링
- CompositeIterator
728x90
반응형
'Design Patterns > 행동(Behavioral)' 카테고리의 다른 글
[Memento]메멘토패턴 (0) | 2022.11.03 |
---|---|
[Mediator]중재자패턴 (0) | 2022.11.01 |
[Interpreter]인터프리터패턴 (0) | 2022.10.25 |
[Command]커맨드패턴 (0) | 2022.10.20 |
[Chain-of-Responsibility]책임연쇄패턴 (0) | 2022.10.20 |