본문 바로가기

Design Pattern

[디자인패턴] Iterator Pattern (반복자 패턴)

  • 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

PackageHouseMenu
DinnerMenu

위처럼 두개의 식당이 존재하는데 하나로 합쳐져서 메뉴들을 통합해야하는 상황이생겼다.

이때 모든 메뉴들을 출력하기 위해서 다음과 같이 구현을 해야한다.

 

Waitress

같은 요소들을 갖고있는 collection들이 서로다른 방식의 자료구조로 이를 구현하고 있다는 이유로 두 개의 서로다른 순환문을 통해서 이들을 순회해야한다. 이렇게 같은 요소들에 다른 여러 방식의 자료구조가 추가된다면 이런 상황은 계속 반복될 것이다. 

 

    → Problem : 1. implementation 대신 interface로 코딩하라는 OO pricinple 위반

                        2. 새로운 자료구조로 object들을 갖고있는 class가 추가되면 또 다시 수정 필요

                        3. 서로다른 순환문에 의해 중복 코드 발생

 

 

 


 

  • Approach using Iterator

DinnerMenuIterator
DinnerMenu
Waitress

이렇게 Iterator를 사용하여 구현하고나니 서로다른 collection에 대해 두 개의 순환문이 필요하지 않게 되었다.

Implementation이 아닌 Iterator의 Interface를 이용한 코드 구현으로 인해 같은 코드로 순회할 수 있게 되었고 구조는 아래와 같다. 

 

이때, Iterator를 굳이 구현하지 않고 Java의 Iterator 클래스를 그대로 이용하여 구현해보겠다.

 

 

 

 


 

  • Approach using Java's Iterator

DinnerMenuIterator
Waitress

1. Waitress가 두 식당(Menu)에게 각각의 Iterator를 요청한다.

2. 각 식당에서 자신의 Iterator를 생성(return new DinnerMenuIterator)하여 반환한다.

3. 반환받은 Iterator를 이용하여 Waitress가 menuitem들을 출력한다.

( printMenu(pancakeIterator); printMenu(dinnerIterator); )

 

 

Java의 Iterator를 이용하여 구현하고 두 collection을 Waitress가 다른 수준으로 보지 않도록 Menu Interface를 통해 두 collection을 같은 수준으로 볼 수 있도록 구현하였다.

 

 

New Design

 

 

 


 

  • 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.