티스토리 뷰

디자인 패턴

16. 이터레이터 패턴

jin-park 2022. 2. 10. 20:36

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.  단점

  • 구조가 복잡해진다.

'디자인 패턴' 카테고리의 다른 글

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
댓글