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 1Notification 2Notification 3----- NOTIFICATION BAR -----Notification 1Notification 2Notification 3Notification 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
'IT > 디자인 패턴(Design Pattern)' 카테고리의 다른 글
[디자인 패턴] 방문자 패턴(Visitor Pattern) (2) | 2019.02.14 |
---|---|
[디자인 패턴] 메멘토 패턴(Memento Pattern) (0) | 2019.02.13 |
[디자인 패턴] 중재자 패턴(Mediator Pattern) (0) | 2019.02.12 |
[디자인 패턴] 커맨드 패턴(Command Pattern) (0) | 2019.02.08 |
[디자인 패턴] 책임 연쇄 패턴(Chain of Responsibility Pattern) (1) | 2019.02.07 |