[디자인 패턴][행동 패턴] 반복자 패턴(Iterator Pattern)
Updated:
1. 개요
어떤 집합 객체에 속한 원소들을 순차적으로 접근할 수 있는 방법을 제공하는 패턴
반복자 패턴(Iterator Pattern)은 행동 패턴(Behavioral Pattern)의 한 종류로, 집합 객체의 내부 표현 구조를 노출하지 않고도 자신의 원소에 접근할 수 있는 방법을 제공하기 위한 패턴이다.
2. 행동 패턴(Behavioral Pattern)
2-1. 행동 패턴이란?
행동 패턴이란 처리의 책임을 어떤 객체에게 할당하는 것이 좋은지, 알고리즘을 어떤 객체에 정의하는 것이 좋은지 등의 책임 분배와 관련된 패턴이다.
2-2. 행동 패턴 종류
3. 구성
[출처 : GoF의 디자인 패턴]
-
Iterator : 원소에 접근하고 순회하는 데 필요한 메서드를 정의한 인터페이스
-
ConcreteIterator : Iterator 인터페이스 구현체
-
Aggregate : Iterator 객체를 생성하는 인터페이스
-
ConcreteAggregate : Aggregate 인터페이스 구현체
4. 예제 코드
Interpreter Pattern을 이용하여 Waiting 중인 사람들의 이름을 차례대로 출력하는 코드를 구현해보자.
4-1. Iterator
[Iterator.java]
1
2
3
4
5
public interface Iterator {
boolean hasNext();
Object next();
}
4-2. ConcreteIterator
[WaitingIterator.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
import java.util.List;
public class WaitingIterator implements Iterator {
private List<String> waitingList;
int index;
public WaitingIterator(List<String> waitingList) {
this.waitingList = List.copyOf(waitingList);
this.index = 0;
}
@Override
public boolean hasNext() {
if(index < waitingList.size()) {
return true;
}
return false;
}
@Override
public Object next() {
if(this.hasNext()) {
return waitingList.get(index++);
}
return null;
}
}
4-3. Aggregate
[Aggregate.java]
1
2
3
4
public interface Aggregate {
Iterator iterator();
}
4-4. ConcreteAggregate
[WaitingAggregate.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.List;
public class WaitingAggregate implements Aggregate {
private List<String> waitingList;
public WaitingAggregate(List<String> waitingList) {
this.waitingList = List.copyOf(waitingList);
}
@Override
public Iterator iterator() {
return new WaitingIterator(waitingList);
}
}
5. 테스트
[Clinet.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.ArrayList;
import java.util.List;
public class Client {
public static void main(String[] args) {
List<String> waitingList = new ArrayList<>();
waitingList.add("Alice");
waitingList.add("Bob");
waitingList.add("Charlie");
waitingList.add("Dave");
WaitingAggregate waitingAggregate = new WaitingAggregate(waitingList);
for(Iterator iterator = waitingAggregate.iterator(); iterator.hasNext(); ) {
String name = iterator.next().toString();
System.out.println("Name : " + name);
}
}
}
[실행 결과]
6. 특징
- 다양한 순회방법 제공 : Iterator의 서브클래스로 새로운 순회방법을 정의가능
Leave a comment