ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 반복자(Iterator) 패턴 - 디자인 패턴
    CSE/Design Pattern 2015. 6. 13. 10:43

    Pattern #14  반복자 패턴





     자세한 표현방법을 나타내지 않고 객체집합의 요소들을 순차적으로 접근하는데 사용







     패턴 요약 
      - 반복을 집합의 요소를 포인트하는 객체 안에 캡슐화 함
      - 리스트 객체와 방문하는 프로세스 사이의 결합을 줄임


     
     동기
      

      당신은 기업정보 관리시스템 개발 프로젝트의 책임자로 선발되었다. 이 프로그램 은 크게 user interface, application logic, data management 세 파트로 나뉘는데 이들은 병렬적으로 개발된다. 개발 에 있어 한 가지 문제점 은 application logic 파트와 data management 파트와의 연결 부분이다 . 즉 , data management 파트에서 개발을 맡고 있는 data structure class의 interface 가 확정되지 않은 상황에서 이를 이용한 application logic 구현은 어려운 형편이다. 팀장으로서 이런 상황에서 제시할 당신의 해결책은? 

     




     








     해결방안1: Data Structure Interface를 단일화
     - 외부에서 사용하는 DS class의 interface를 통일











     해결방안1 문제점
     - 다른 DS class로 교체될 때마다 Client code 수정 필요
     - 자료구조 검색과 상관없더라도 DS class의 interface가 수정될 때 마다 client code 재 컴파일 필요
     - 자료구조 관리를 위한 기존의 interface와 Client를 위해 단일화된 검색 interface, 두가지가 하나의 DS class로 구현을 하기 때문에 class의 크기가 커지고, 더욱 복잡해진다.





     해결방안2: 자료구조 검색을 자료구조 Class와 분리
     - Data Structure class에서 Client가 필요로 하는 자료구조 검색부분을 분리 -Interator class
     - 각 DS class마다 해당 자료구조의 검색을 위한 Iterator 객체 생성 함수를 구현 - CreateIterator()





     






     의도
     - 동일한 자료형의 객체가 여러 개 모여 있을 때 각 객체들을 순차적으로 접근할 수 있는 방법을 제공한다.
     - 검색 기능을 자료구조와 분리시켜 객체로 만든다.



     별칭
     - Cursor



     적용범위
     - 여러 객체들을 모아 관리하는 Aggregate 객체에 대해 내부 구조나 구현에 신경쓰지 않고 저장된객체들을 순차적으로 접근하고자할 때
     - 동일한 Aggregate 객체에 대해 여러 개의 검색 instance를 가지고자 할 때
      * Iterator *iter1 = ds->CreateInstance();  순방향 검색에 사용
      * Iterator *iter2 = ds->CreateInstance();  역방향 검색에 사용
     - 서로 다른 구조를 가긴 Aggregate 객체에 대해 저장된 객체들을 접근하기 위한 interface를 단일화하고자 할 때



     결과
     - ConcreteIterator 구현에 따라 다양한 형태의 검색을 지원 할 수 있다.
     - 반복자는 Aggregate interface를 단순화시킨다.
     





    IIterator.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    package iterator;
     
    public interface IIterator {
        public boolean hasNext();
     
        public Object next();
    }
     
    cs





     IContainer.java

     

    1
    2
    3
    4
    5
    6
    7
     
    package iterator;
     
    public interface IContainer {
        public IIterator createIterator();
    }
     
    cs




    RecordCollection.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    package iterator;
     
    public class RecordCollection implements IContainer {
     
        private String recordArray[] = { "first""second""third""fourth",
                "fifth" };
     
        public IIterator createIterator() {
            RecordIterator iterator = new RecordIterator();
            return iterator;
        }
     
        private class RecordIterator implements IIterator {
            private int index;
     
            public boolean hasNext() {
                if (index < recordArray.length) {
                    return true;
                } else {
                    return false;
                }
            }
     
            public Object next() {
                if (this.hasNext()) {
                    return recordArray[index++];
                } else {
     
                    return null;
                }
            }
     
        }
     
    }
     
    cs

     





    IteratorMain.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    package iterator;
     
    public class IteratorMain {
        public static void main(String[] args) {
            RecordCollection recordCollection = new RecordCollection();
            IIterator iter = recordCollection.createIterator();
     
            while (iter.hasNext()) {
                System.out.println(iter.next());
            }
        }
    }
    cs


     







      


    댓글

Designed by Tistory.