행동 패턴: 이터레이터 패턴

xellos·2022년 4월 18일
0

디자인 패턴

목록 보기
20/20

소개

집합 객체 내부 구조를 노출시키지 않고 순회하는 방법을 제공하는 패턴이다.
→ 집합 내부 객체를 순회하는 클라이언트 코드를 변경하지 않고 다양한 순회 방법을 제공할 수 있다.

1) 장점

  1. 집합 객체가 가지고 있는 객체에 손쉽게 접근할 수 있다.
  2. 일관된 인터페이스를 사용해 여러 형태의 집합 구조를 순회할 수 있다.

2) 단점

  1. 클래스가 늘어나고 복잡도가 증가한다.

구조


구현

1) 대상 클래스 정의

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);
    }
}

2) Iterator를 구현하는 클래스 정의

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

사용

public class Client {
	public static void main(String[] args) {
    	Board board = new Board();
        board.addPost("디자인 패턴");
        board.addPost("지금은 이터레이터 패턴을 학습중입니다.");
        board.addPost("지금 이 글을 보고 계시면 이터레이터 패턴을 학습하고 계십니다.");
        
        //들어간 순서대로 순회하기
        List<Post> posts = board.getPosts();
        Iterator<Post> iterator = posts.iterator();
        
        for(int i = 0; i < posts.size(); i++) {
        	Post post = posts.get(i);
            System.out.println(post.getTitle());
        }
        
        //가장 최신 글 먼저 순회하기
        Iterator<Post> recentPostIterator = board.getRecentPostIterator();
        while(recentPostIterator.hasNext()) {
        	System.out.println(recentPostIterator.next().getTitle());
        }
    }
}

0개의 댓글