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
참조
'JAVA > DesignPattern' 카테고리의 다른 글
Design Pattern 디자인 패턴 Mediator Pattern 중재자 패턴 (0) | 2021.12.25 |
---|---|
Design Pattern 디자인 패턴 Interpreter Pattern 인터프리터 패턴 (0) | 2021.12.24 |
Design Pattern 디자인 패턴 Command Pattern 커맨드 패턴 (0) | 2021.12.22 |
Design Pattern 디자인 패턴 Chain of Responsibility Pattern 책임체인패턴 (0) | 2021.12.21 |
Design Pattern 디자인 패턴 Proxy Pattern 프록시 패턴 (0) | 2021.12.20 |