본문 바로가기
Theory/Design Pattern

Iterator Pattern

by y.j 2022. 5. 15.
728x90

Iterator Pattern

aggregate object의 내부를 알지 못해도 요소들을 접근 하는 방법이다.

어떻게 object의 내부를 표출시키지 않고 요소들을 접근할 수 있을까?

aggregate object란 array, set같은 object를 이야기 한다. 이러한 object의 요소들을 접근하기 위해 내부를 노출시킨다면 캡슐화에 위배된다.

 

solution

Aggregate와 Iterator를 분리하여 Aggregate내에 Iterator를 내부 클래스로 구현한다. 왜 분리해서 구현해야 할까?

aggregate object와 독립적으로 새로운 operation을 추가하기가 어렵다. 또, 요소를 탐색하는데 여러가지 iterator를 둘 수 없다.

public class Aggregate1<E> implements Aggregate<E> {
    private Object[] elementData;
    private int idx;
    private int size;

    public Aggregate1(int size) {
        if(size < 0)
            throw new IllegalArgumentException("size : " + size);
        this.size = size;
        this.elementData = new Object[size];
    }

    @Override
    public Iterator<E> createIterator() {
        return new Iterator1<E>();
    }

    @Override
    public boolean add(Object element) {
        if(idx < size) {
           elementData[idx++] = element;
           return true;
        }
        return false;
    }

    private class Iterator1<E> implements Iterator<E> {
        private int cursor = 0;

        @Override
        public E next() {
            if(cursor >= size )
                throw new NoSuchElementException();
            return (E) elementData[cursor++];
        }

        @Override
        public boolean hasNext() {
            return cursor < size;
        }
    }
}

위는 Aggregate의 소스코드이다. createIterator는 new Iterator로 새로운 Iterator를 생성하게 되어 같은 aggregate object를 따로 탐색하여 구현하는 것이 가능해진다.

 

Advantages

• 같은 aggregate object를 여러개의 Iterator로 탐색 할 수 있다.
• aggregate object의 interface가 단순해진다.

 - iterator와 aggregate가 분리되어 있기 때문이다.
• 탐색 알고리즘을 run-time에 교체 할 수 있다.

 

[전체코드]

https://github.com/jKyounju/adapterPatterns/tree/master/src/BehavioralPattern/IteratorPattern

728x90

'Theory > Design Pattern' 카테고리의 다른 글

Memento Pattern  (0) 2022.05.21
Mediator Pattern  (0) 2022.05.15
Interpreter Pattern  (0) 2022.05.14
Command Pattern  (0) 2022.05.12
Chain Of Responsibility Pattern  (0) 2022.05.10

댓글