본문 바로가기

IT/디자인 패턴(Design Pattern)

[디자인 패턴] 이터레이터 패턴(Iterator Pattern)

1) 개요


이터레이터(Iterator)란 반복하다라는 의미로 어떠한 객체의 집합을 순서대로 명령을 처리할 수 있게 해주는 디자인 패턴입니다.

거의 대부분의 프로그래밍 언어에서 콜렉션(Collectins) 자료구조에 사용이 가능하며, 간단하면서도 실제로도 굉장히 많이 쓰고있는 패턴입니다. 

for문의 i++에서 i를 하나씩 증가시키면서 콜렉션 요소 전체를 처음부터 차례대로 검색할 때, 사용되는 증가 변수인 i의 기능을 추상화해서 일반화한 것을 디자인 패턴화 시킨 것이 이터레이터 패턴입니다.


2) UML

- Iterator : 순서대로 객체를 검색하는 인터페이스를 정합니다.

- ConcreateIterator : Iterator에서의 인터페이스를 구현합니다.

- Aggregate : Iterator의 역할을 만드는 인터페이스를 정합니다.

- ConcreateAggreagate : Aggregate에서의 인터페이스를 구현합니다.


3) 예제


1
2
3
4
public interface Iterator {
    boolean hasNext();
    Object next();
}
cs


1
2
3
4
public interface Collection {
    public Iterator createIterator();
}
 
cs


1
2
3
4
5
6
7
8
9
10
public class Notification {
    String notification;
    
    public Notification(String notification) {
        this.notification = notification;
    }
    public String getNotification() {
        return notification;
    }
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class NotificationBar {
    NotificationCollection notifications;
    
    public NotificationBar(NotificationCollection notifications) {
        this.notifications = notifications;
    }
    
    public void printNotifications() {
        Iterator iterator = notifications.createIterator();
        System.out.println("----- NOTIFICATION BAR -----");
        while(iterator.hasNext()) {
            Notification n = (Notification)iterator.next();
            System.out.println(n.getNotification());
        }
    }
}
cs

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
29
30
public class NotificationCollection implements Collection{
    static final int MAX_ITEMS = 6;
    int numberOfItems = 0;
    Notification[] notificationList;
    
    public NotificationCollection() {
        notificationList = new Notification[MAX_ITEMS];
        
        addItem("Notification 1"); 
        addItem("Notification 2"); 
        addItem("Notification 3"); 
    }
    
    public void addItem(String str) {
        Notification notification = new Notification(str);
        if(numberOfItems >= MAX_ITEMS) {
            System.out.println("Full");
        }
        else {
            notificationList[numberOfItems] = notification;
            numberOfItems = numberOfItems + 1;
        }
    }
    
    @Override
    public Iterator createIterator() {
        return new NotificationIterator(notificationList);
    }
}
 
cs

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
public class NotificationIterator implements Iterator{
    Notification[] notificationList;
    int pos = 0;
    
    public NotificationIterator(Notification[] notificationList) {
        this.notificationList = notificationList;
    }
    
    @Override
    public boolean hasNext() {
        if (pos >= notificationList.length || 
            notificationList[pos] == null)
            return false;
        else 
            return true;
    }
 
    @Override
    public Object next() {
        Notification notification = notificationList[pos];
        pos += 1;
        return notification;
    }
    
}
cs

1
2
3
4
5
6
7
8
9
10
public class Main {
    public static void main(String[] args) {
        NotificationCollection nc = new NotificationCollection();
        NotificationBar nb = new NotificationBar(nc);
        nb.printNotifications();
        
        nc.addItem("Notification 4");
        nb.printNotifications();
    }
}
cs




RESULT


----- NOTIFICATION BAR -----
Notification 1
Notification 2
Notification 3
----- NOTIFICATION BAR -----
Notification 1
Notification 2
Notification 3
Notification 4

- References :

http://www.incodom.kr/%EC%9D%B4%ED%84%B0%EB%A0%88%EC%9D%B4%ED%84%B0_%ED%8C%A8%ED%84%B4

https://www.geeksforgeeks.org/iterator-pattern/