JAVA/DesignPattern

Design Pattern 디자인 패턴 Iterator Pattern 이터레이터 패턴

호두밥 2021. 12. 23. 21:11

Iterator Pattern  이터레이터 패턴

행동패턴으로, 콜랙션(리스트,맵 등)의 기본 표현을 노출하지 않고 요소에 순차적으로 접근해야 할 때 사용하는 패턴입니다. 

Iterator Pattern  이터레이터 패턴이 적합한 경우

  • 콜랙션이 복합한 데이터 구조를 가지고 있지만, 고객에게 그 복잡함을 보여주고 싶지 않은 경우
    • 데이터 구조가 복합하더라고 이터레이터를 이용해서 고객이 순차적으로 값에 접근하게 할 수 있습니다. (ex, HashMap, HashSet)
  • 순회 코드의 중복을 줄이고 싶은 경우
  • 사전에 데이터 구조가 알려지지 않은 경우, 기존 코드가 다양한 데이터 구조를 순환할 수 있도록 하고 싶은 경우 

장단점

장점

  • 다양한 데이터 순회 알고리즘을 코드를 분리할 수 있습니다.(단일책임원칙)
  • 기존 코드를 수정하지 않고도 새로운 타입의 콜랙션과 이터레이터를 추가할 수 있습니다. (개방/폐쇄원칙)
  • 객체마다 이터레이터를 가지고 있기 때문에 같은 콜랙션을 병렬처리할 수 있습니다. 
  • 필요할 때, 순회(iteration)을 지연시키거나, 이어서 진행할 수 있습니다.

단점

  • 간단한 컬랙션인 경우, 이터레이터 패턴을 적용하는 것은 과도할 수 있습니다.
  • 콜랙션에서 특정 위치의 요소에 바로 접근해야 할 때, 이터레이터를 사용하는 것은 비효율적일 수 있습니다.  

 

Iterator Pattern  이터레이터 패턴 구현

Iterator

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

Repository

public interface Repository {
    Iterator getIterator();
}

SampleRepository

public class SampleRepository implements Repository{

    public String[] sample;

    public SampleRepository(String[] sample) {
        this.sample = sample;
    }

    @Override
    public Iterator getIterator() {
        return new SampleIterator();
    }

    public class SampleIterator implements Iterator{
        int index;
        @Override
        public boolean hasNext() {
            return index < sample.length;
        }

        @Override
        public Object next() {
            if(this.hasNext()){
                return sample[index++];
            }
            return null;
        }
    }

}

Main

public class Main {
    public static void main(String[] args) {
        Repository repository = new SampleRepository(new String[]{"A", "B", "c", "d", "e"});
        Iterator iterator = repository.getIterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
A
B
c
d
e

 

참조