salsa source

[디자인패턴]소개 및 Iterator 패턴 본문

STUDY/디자인패턴

[디자인패턴]소개 및 Iterator 패턴

dayofday 2018. 2. 7. 21:53

소개&iterator.pdf

<출처 : Java 언어로 배우는 디자인패턴 입문>



디자인패턴  the Gang of Four(GoF)

 

매일 쓰고있는 프로그램을 새로운 시점에서 다시 생각하고, 재사용을 쉽게 하고

기능 확장이 쉬운 소프트웨어를 만들기 위한 유익한 기법.  (GoF 가장 유명)



UML(Unified Modeling Language)

시스템을 시각화하거나 시스템의 사양이나 설계를 문서화하기 위한 표현 방법

 

클래스 다이어그램

클래스나 인스턴스, 인터페이스 등의 정적인 관계를 표현한 .

필드 == 멤버변수        메소드 == 멤버함수

인터페이스 : 클래스들이 구현해야 하는 동작을 지정하는 사용되는 추상형

 

시퀀스 다이어그램

시간에 따라 변하는 . 동적인 관계



Iterator - 순서대로 지정해서 처리하기

복수의 요소가 모여있는 집합에서 요소를 순서대로 지정해서 처리하는 Iterator 패턴

Iterator 패턴 - 다수의 집합에서 순서대로 지정하며 전체를 검색하는 처리를 실행하기 위한

Iterator == 반복자  무엇인가를 반복한다라는 의미

 

 

Iterator  (반복자)

요소를 순서대로 검색해가는 인터페이스를 결정.

다음 요소가 존재하는지 hasNext()  다음 요소 얻는 next()

 

ConcreateIterator  (구체적인 반복자)

Iterator 결정한 인터페이스 구현

검색하기 위한 정보 가지고 있어야

 

Aggregate (집합체)

 Iterator 만들어내는 인터페이스를 결정

 

ConcreateAggregate (구체적인 집합체)

Aggregate역할이 결정한 인터페이스를 실제로 구현

ConcreateIterator 역할의 인스턴스 만듦






Aggregate 인터페이스

 

Public interface Aggregate{

public abstract Iterator interator();

}



Iterator 인터페이스

 

public interface Iterator{

public abstract boolean hasNext();

public abstract Object next();

}



BookShelf 클래스

 

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(){
        return new BookShelfIterator(this);
    }
}

 



BookShelfIterator 클래스

 

public class BookShelfIterator implements Iterator{
    private BookShelf booShelf;
  //검색할 서가
    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 = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}



public class Main {
    public static void main(String[] args){
        BookShlf bookShelf = new BookShelf(4);
   // 4권있는 서가 만들기

 

        bookShelf.appendBook(new Book("Around the World in 80"));
        bookShelf.appendBook(new Book("Bible"));
        bookShelf.appendBook(new Book("Cinderella"));
        bookShelf.appendBook(new Book("Daddy-Long-Legs"));

        Iterator it = bookShelf.iterator();  //서가를 검색하기 위한  iterator 인스턴스

 

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







Iterator 패턴을 사용해야하는 이유?

 

  • 구현과 분리해서 하나씩 있다!

 

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

 

Bookshelf 구현에 의존하지 않음

Bookshelf 어떻게 수정하더라도 while루프는 변경하지 않아도 동작하게

 

  • 클래스의 재이용화를 촉진

클래스를 부품처럼 사용 가능.

하나의 부품을 수정해도 다른 부품에도 영향 없이 적은 수정만으로 끝낼 있음



Comments