- Usage of Iterator Pattern
- Issues
- Approach using Iterator
- Approach using Java's Iterator
- Summary
- Related Patterns
- Usage of Iterator Pattern
Purpose
- aggregate object의 구현방법을 알지않고 요소에 접근할 수 있도록 하기위해
(*aggregate object : 특정 object들을 배열, 리스트 등.. group형식으로 갖고있는 객체 /
container 혹은 collection이라 불린다)
Use When
- 특정 요소들에 대해 여러가지 순회 방법이 필요할 때 (ex. ArrayList로 순회, 배열로 순회)
- 순회하는데에 uniform interface가 필요할 때
- Issues
위처럼 두개의 식당이 존재하는데 하나로 합쳐져서 메뉴들을 통합해야하는 상황이생겼다.
이때 모든 메뉴들을 출력하기 위해서 다음과 같이 구현을 해야한다.
같은 요소들을 갖고있는 collection들이 서로다른 방식의 자료구조로 이를 구현하고 있다는 이유로 두 개의 서로다른 순환문을 통해서 이들을 순회해야한다. 이렇게 같은 요소들에 다른 여러 방식의 자료구조가 추가된다면 이런 상황은 계속 반복될 것이다.
→ Problem : 1. implementation 대신 interface로 코딩하라는 OO pricinple 위반
2. 새로운 자료구조로 object들을 갖고있는 class가 추가되면 또 다시 수정 필요
3. 서로다른 순환문에 의해 중복 코드 발생
- Approach using Iterator
이렇게 Iterator를 사용하여 구현하고나니 서로다른 collection에 대해 두 개의 순환문이 필요하지 않게 되었다.
Implementation이 아닌 Iterator의 Interface를 이용한 코드 구현으로 인해 같은 코드로 순회할 수 있게 되었고 구조는 아래와 같다.
이때, Iterator를 굳이 구현하지 않고 Java의 Iterator 클래스를 그대로 이용하여 구현해보겠다.
- Approach using Java's Iterator
1. Waitress가 두 식당(Menu)에게 각각의 Iterator를 요청한다.
2. 각 식당에서 자신의 Iterator를 생성(return new DinnerMenuIterator)하여 반환한다.
3. 반환받은 Iterator를 이용하여 Waitress가 menuitem들을 출력한다.
( printMenu(pancakeIterator); printMenu(dinnerIterator); )
Java의 Iterator를 이용하여 구현하고 두 collection을 Waitress가 다른 수준으로 보지 않도록 Menu Interface를 통해 두 collection을 같은 수준으로 볼 수 있도록 구현하였다.
- Summary
- 이렇게 Iterator Pattern을 이용하면 aggregate object의 구체적인 구현을 알지 못해도 요소들에 순차적으로 접근할 수 있다. (Provides a way to access the elements of an aggregate object sequentially without exposing its underlying representation)
- SRP 원칙을 지키게 된다. (각 Aggregation Object는 Aggregate & Iteration 두 가지의 책임을 갖고 있었다. But, Aggregate와 Iteration을 분리함)
- Related Patterns
- Iterator can traverse a Composite. Visitor can apply an operation over a Composite.
- Polymorphic Iterators rely on Factory Methods to instantiate the appropriate Iterator subclass.
- Memento is often used in conjunction with Iterator. An Iterator can use a Memento to capture the state of an iteration. The Iterator stores the Memento internally.
'Design Pattern' 카테고리의 다른 글
[디자인패턴] Visitor Pattern (방문자 패턴) (0) | 2019.11.14 |
---|---|
[디자인패턴] Mediator Pattern (중재자 패턴) (0) | 2019.11.11 |
[디자인패턴] State Pattern (스테이트 패턴) (0) | 2019.11.11 |
[디자인패턴] Composite Pattern (컴포지트 패턴) (0) | 2019.11.10 |
[디자인패턴] Singleton Pattern (싱글톤 패턴) (0) | 2019.11.07 |