Search results for 'Iterator'

행위(Behavioral) 패턴 - Iterator

2007/05/09 23:43
Iterator 는 디자인 패턴에서 가장 간단하고 가장 빈번하게 사용되는 패턴들 중의 하나.  Iterator 패턴은 데이터의 내부적인 표현을 자세하게 아는 것 없이 표준적인 인터페이스를 이용한 데이터의 리스트나 컬렉션을 통하여 이동하는 것을 허용. 게다가 어떤 특별한 프로세싱과 데이터 컬렉션의 특정한 원소를 반환을 하는 특별한 Iterator를 정의할 수 있음.

1. 동기
Iterator는 어떻게 Iterator가 데이터를 이동시키는지를 드러내지 않고 데이터 원소들의 집합을 통하여 이동하는 정의된 Iterator는 인터페이스(interface)이기 때문에 반환되는 데이터를 위한 편리한 어떤 방법이든 구현

2. 고려해야 할 사항
컬렉션 또는 데이터 소스는 보통 클라이언트가 데이터를 조작할 수 있는 방법을 제공해야 함. 그러나, 컬렉션 또는 데이터 소스에 직접 데이터 조작 로직을 놓는 것은 항상 바람직하지 않음.
이 문제를 해결하기 위해 다음과 같은 사항에 유의.
  • 호출자가 컬렉션을 억세스하기 위한 로직을 직접 사용할 경우 불필요하게 작업이 복잡해지고 컬렉션에 강하게 결합되는 문제가 발생
  • 컬렉션에 존재하는 데이터 요소들을 접근하는 것은 시간을 낭비하지 않으면서 쉬워야 함
  • 다른 종류의 컬렉션들을 항상 같은 방법으로 접근할 수 있어야 함

3. 구조

사용자 삽입 이미지

CatalogIterator.java (Language : java)
  1. public interface CatalogIterator {
  2.  public boolean hasMoreElements();
  3.  public Object nextElement();
  4.  public Object currentElement();
  5.  public Object previousElement();
  6. }

ResultSetIterator.java (Language : java)
  1. public class ResultSetIterator implements CatalogIterator {
  2.  private CaltalogDataSource ds
  3.  private int index;
  4.  
  5.  public ResultSetIterator(CatalogDataSource ds) {
  6.   this.ds = ds;
  7.   this.index = index;
  8.  }
  9.  
  10.  public boolean hasMoreElements() {
  11.   if (index < ds.getLength()) return true;
  12.   else return false;
  13.  }
  14.  
  15.  public Object nextElement() {
  16.   Object result = ds.getNextResult(index);
  17.   index++;
  18.   return result;
  19.  }
  20.  
  21.  public Object currentElement() {
  22.   return null;
  23.  }
  24.  
  25.  public Object previousElement() {
  26.   return null;
  27.  }
  28. }

CatalogDataSource.jva (Language : java)
  1. public interface CatalogDataSource {
  2.  public CatalogIterator iterator();
  3.  public int getLength();
  4.  public Object getNextResult(int index);
  5.  public void appendResult(Object result);
  6. }

ResultSetWrapper.java (Language : java)
  1. public class ResultSetWrapper inplements CatalogDataSource {
  2.    private Object[] results;
  3.    private int last;
  4.  
  5.    public CatalogIterator iterater() {
  6.       return new ResultSetIterator(this);
  7.    }
  8.  
  9.    public int getLength() {
  10.       return last;
  11.    }
  12.  
  13.    public Object getNextResult(int index) {
  14.       return results[index];
  15.    }
  16.  
  17.    public void appendResult(Object result) {
  18.       this.results[last] = result;
  19.       last++;
  20.    }
  21. }

Client.java (Language : java)
  1. public class Client {
  2.    public static void main(String[] args) {
  3.       ResultSetWrapper results = new ResultSetWrapper(3);
  4.       results.appendResult(new Integer(10));
  5.       results.appendResult("hello");
  6.       results.appendResult(new java.util.Data());
  7.  
  8.       CatalogIterator it = results.iterator();
  9.       while(it.hasMoreElements()) {
  10.          System.out.println(it.nextElement());
  11.       }
  12.    }
  13. }

4. 자바 프로그램언어에서의 사용 예
사용자 삽입 이미지
  • J2SETM 플랫폼에서의 java.util 패키지에 존재하는 컬렉션에서 Iterator 패턴을 사용.
  • Collection 인터페이스는 클라이언트가 Iterator 서브타입의 객체를 사용할수 있도록 iterator 메소드를 제공.
  • List 인터페이스는 클라이언트가 ListIterator 서브타입의 객체를 사용할 수 있도록 listIterator 메소드를 정의. ListIterator 메소드는 Iterator 인터페이스보다 데이터 접근을 위한 좀더 많은 메소드를 정의.
  • Iterator와 ListIterator 서브타입을 사용함으로써, 클라이언트는 일반적인 데이터 접근코드를 이용해 Collection 또는 List 서브타입을 액세스. 

5. 결과

  • 장점
    억세스 관련 메소드를 정의하지 않음으로써 collection interface가 좀더 간단해짐
    컬렉션 종류와 상관없이 동일한 방업을 컬렉션에 존재하는 요소들을 억세스할 수 있음
    같은 컬렉션에 대해 다른 억세스 알고리즘을 지원
    동시에 억세스 할 수 있도록 지원
  • 단점
    런타임에 오브젝트가 추가적으로 생성
    쓰레드 환경에서 iterator를 통해 테이터를 억세스 하는 경우 다른 iterator가 접근할 수 없도록 설계해야 함
이올린에 북마크하기

happyness Programming/J2EE Patterns , ,

2007/05/09 23:43 2007/05/09 23:43
[로그인][오픈아이디란?]