디자인패턴

[Java] Iterator 패턴

ZzangHo 2022. 3. 31. 23:10
728x90

디자인 패턴 공부용으로 블로그에 기록을 해본다.

공부에 참고한 자료로는 "Java 언어로 배우는 디자인 패턴 입문" 을 참고 하였다.

정의

무엇인가 많이 모여있는 것들을 순서대로 지정하면서 전체를 검색하는 처리를 실행하기 위한 것입니다.


예제 프로그램

Iterator 패턴을 사용하여 서가(BookShelf) 안에 책(Book)을 넣고, 그 책의 이름을 차례대로 표시하는 프로그램을 만들어 보자

 

클래스 설명

이름 해설
Aggregate 집합체를 나타내는 인터페이스
Iterator 하나씩 나열하면서 검색을 실행하는 인터페이스
Book 책을 나타내는 클래스
BookShelf 서가를 나타내는 클래스
BookShelfIterator 서가를 검색하는 클래스
Main 동작 테스트용 클래스


Aggregate 인터페이스

package Iterator;


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

 

Iterator 인터페이스

package Iterator;

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}

 

Book 클래스

package Iterator;

public class Book {
    private String name;

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

 

BookShelf 클래스

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

    @Override
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}

 

BookShelfIterator 클래스

package Iterator;

public class BookShelfIterator implements Iterator {
    private BookShelf bookShelf;
    private int index;

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }

    @Override
    public boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public Object next() {
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}

 

Main 클래스

package Iterator;

public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("Git 교과서"));
        bookShelf.appendBook(new Book("엘라스틱서치 실무 가이드"));
        bookShelf.appendBook(new Book("카프카 핵심 가이드"));
        bookShelf.appendBook(new Book("배민다움"));

        Iterator it = bookShelf.iterator();
        while (it.hasNext()) {
            Book book = (Book) it.next();
            System.out.println(book.getName());
        }
    }
}

 

위의 Main 클래스의 실행 결과를 보면 다음과 같다.

Git 교과서
엘라스틱서치 실무 가이드
카프카 핵심 가이드
배민다움

Process finished with exit code 0