반응형
이터레이터 패턴
행동 패턴이란?🤔
어떤 처리의 책임을 어느 객체에 할당하는 것이 좋은지, 알고리즘은 어느 객체에 정의하는 것이 좋은지 다루는
패턴.
이터레이터 패턴이란?🤔
집합 객체를 순회하는 패턴
집합 객체의 "내부 구조"를 "노출시키지 않고", 순회하는 방법을 제공하는 패턴.
내부 구조를 들어내지 않고 클라이언트가 요소들을 순회할 수 있도록 한다.
집합 객체를 순회는 클라이언트 코드를 변경하지 않고 다양한 순회 방법을 제공할 수 있다.
집합 객체를 순회하는 다양한 방법을 지원하고 싶을 때
- 트리를 순회 방법.(ex. 중위 순회, 전위 순회, 후위 순회)
- 객체의 특성에 따라 원하는 대로 Iterator를 구현하여, 순회 가능
Aggregate: 집합체를 의미하는 인터페이스. Iterator를 만들어내는 인터페이스!!
ConcreteAggregate: Aggregate 구현체
Iterator: 컬렉션 요소들을 순서대로 검색하기 위한 인터페이스
ConcreteIterator: iterator 구현체
코드⌨️
먼저 집합 객체 만들어 놓고, 그것들을 원하는 대로 순회하는 코드 만들기 커스텀할 수 있는 것
클라이언트 코드가 객체 안을 알 필요가 없어야 된다.
RecentPostIterator(ConcreteIterator)
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();
}
}
Board(ConcreteAggregate)
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);
}
}
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());
}
}
}
장단점🤭
장점
1. 집합 객체가 가지고 있는 객체들을에 손쉽게 접근할 수 있다.
-> 집합 객체가 어떠한 구조로 되어있는 지 알필요 없이 Iterator만 알면 된다.
-> hasNext와 next만 알면 모든 집합을 순회 할 수 있다.
-> 순회하는 로직만 책임을 분리해서 iterator 인터페이스가 가지고 있고,
그것을 분리해놓 기 때문에, SRP를 지킨다.
2. 일관된 인터페이스를 사용해 여러 형태의 집합 구조를 순회할 수 있다.
단점
1. 어김없는 코드가 복잡하다,,,
변경될 집합 객체를 순회하고 있고, 이 집합 객체가 변경될 가능성이 있다면, 이터레이터 패턴을 사용하여, 순회 과정을 숨길 때 사용하면 좋을 것이다.
자바와 스프링에서는 어디서 사용될까?🤔
자바
1. java.util.Enumeration, java.util.Iterator
-> 둘다 자바에서 제공하는 컬렉션에 대해 각 컬렉션의 항목들을 순차적으로 접근하는데 사용된다.
-> Iterator는 Enumeration의 기능을 확장했다.
-> Iterator는 remove 메서드를 통해 원본 컬렉션의 데이터를 삭제할 수 있다.
2. Java StAX(Streaming API for XML)의 iterator 기반 API
-> 콘솔 기반의 API, 이터레이터 기반의 API를 제공함.
-> XML 코드를 순회를 한다.
스프링
1. CompositeIterator
-> 기존의 Iterator에 기능(add)을 추가한 것
Reference
- 코딩으로 학습하는 GoF의 디자인 패턴 - 백기선님 강의
반응형
'✍🏻study > 🚘oodp' 카테고리의 다른 글
브릿지 패턴이란❓ (0) | 2022.08.29 |
---|---|
Builder패턴, 그리고 Builder annotation는 뭘까🧐 (2) | 2022.03.15 |
DI가 뭔데? (0) | 2022.03.11 |