본문 바로가기
공부(~2016)/디자인패턴

Iterator 패턴

by soy; 2014. 7. 7.

Iterator 패턴

무엇인가 많이 모여있는 집합체의 요소들을 통일된 방법으로, 순서대로 접근하는 방법. 

 

구현 예시

1. 집합체를 나타내는 인터페이스인 Aggregate를 생성하고, Iterator를 만들어서 반환해주는 메소드인 iterator()를 정의함

public interface Aggregate {
    public abstract Iterator iterator();
}


2. Aggregate 인터페이스를 구현한 콘크리트 클래스를 작성하고 iterator()를 오버라이드 함.

public class BookShelf implements Aggregate {
    private Book[] books;
    private int last = 0;
    public BookShelf(int maxsize) {
        this.books = new Book[maxsize];
    }
    public Book getBookAt(int index) {
        return books[index];
    }
    public void appendBook(Book book) {
        this.books[last] = book;
        last++;
    }
    public int getLength() {
        return last;
    }
    public Iterator iterator() {    // BookShelfIterator 타입이 아닌 Iterator 타입으로 반환
        return new BookShelfIterator(this);
    }
 }

 

3. Iterator 인터페이스 내에 집합체의 요소들을 순서대로 접근하기 위한 메소드를 정의함.

public interface Iterator {
    public abstract boolean hasNext();  // 다음에 next()를 호출해도 괜찮은지를 조사
    public abstract Object next();      // 현재의 요소를 반환하면서, 다음 위치로 이동
}

 

4. Iterator 인터페이스를 구현한 콘크리트 클래스를 작성하고 hasNext(), next()를 오버라이드한다. 의도에 따라 접근 방향을 정방향, 역방향 등으로 구현 가능하다. 또한 이 클래스는 접근할 집합체인 bookShelf를 인스턴스 변수로 가지고 있다(aggregation).

public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;
    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }
    public boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }
    public Object next() {
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}


5. 메인 클래스

public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("Around the World in 80 Days"));
        bookShelf.appendBook(new Book("Bible"));
        bookShelf.appendBook(new Book("Cinderella"));
        bookShelf.appendBook(new Book("Daddy-Long-Legs"));

        Iterator it = bookShelf.iterator();  // BookShelfIterator 타입이 아닌 Iterator 타입으로 반환받음
        while (it.hasNext()) {
            Book book = (Book)it.next();
            System.out.println(book.getName());
        }
    }
}

 

특징/장점

- Iterator를 사용하면, 사용(메인 메소드의 while문)과 구현을 분리할 수 있다.

- BookShelf 클래스의 구현 방법이 바뀌어도, 메인 메소드는 수정할 필요가 없다.


 



댓글0