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 |
댓글