본문 바로가기

강의/Design pattern

이터레이터(Iterator) 패턴

SMALL

Iterator Pattern

집합 객체를 순회하는 패턴. 내부 구현을 드러내지 않고 클라이언트가 내부의 요소 아이템을 순회한다. 자바의 Iterator도 인터페이스 중 하나다.


Code Example

Iterator를 쓰면 객체가 List라는 것을 알게 되는 단점이 있다.

Client

public class Client {
	public static void main(String[] args) {
		Board board = new Board();
		board.addPost("111");
		board.addPost("222");
		board.addPost("333");

		// 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 addPost(String content) {
		this.posts.add(new Post(content));
	}
}

Code Example - 2

Client

public class Client {
	public static void main(String[] args) {
		Board board = new Board();
		board.addPost("111");
		board.addPost("222");
		board.addPost("333");

		// TODO 들어간 순서대로 순회하기
		Iterator<Post> iterator = board.getDefaultIterator();
		while(iterator.hasNext()) {
			System.out.println(iterator.next().getTitle());
		}

		// TODO 가장 최신 글 먼저 순회하기
		Iterator<Post> recentPostIterator = board.getRecentIterator();
		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> getDefaultIterator() {
		return new RecentPostIterator(this);
	}
}

RecentPostIterator

public class RecentPostIterator implements Iterator<Post> {
	private Iterator<Post> internalIterator;
	private Board board; // 선택

	public RecentPostIterator(List<Post> posts) {
		Collections.sort(posts, (p1, p2) -> p2.getCreatedDateTime().compareTo());
		this.internalIterator = posts.iterator();
	}

	@Override
	public boolean hasNext() {
		return this.internalIterator.hasNext();
	}
	@Override
	public Post next() {
		return this.internalIterator.next();
	}
}

장단점

장점

  • 집합 객체가 가지는 객체들에 쉽게 접근 가능
  • 일관된 인터페이스를 사용해 여러 형태의 집합 구조를 순회 가능

단점

  • 클래스가 늘어나고 복잡도 증가

Example

Enumeration, Iterator

java 9 에서는 자동으로 Iterator로 변환도 해주고, Iterator의 사용 빈도도 증가했다.

Java StAX (XML API)

XmlEventReader, XmlEventWriter

Streaming과 관련한 iterator

CompositeIterator

SMALL

'강의 > Design pattern' 카테고리의 다른 글

관찰자(Observer) 패턴  (0) 2022.09.22
중재자(Mediator) 패턴  (0) 2022.09.22
인터프리터(Interpreter) 패턴  (0) 2022.09.22
커맨드(Command) 패턴  (0) 2022.09.22
책임 연쇄 패턴  (0) 2022.09.22