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의 서브클래스로 새로운 순회방법을 정의가능

Updated:

Leave a comment