본문 바로가기

💻 개발IT/Design Patterns

3. Behavior 패턴 - Iterator Pattern

문제 정의

한 마을에 두 개의 레스토랑이 있는데 두 레스토랑을 합치려고 한다.

다행히도 두 레스토랑은 menuItem의 property는 동일하다.

첫 번째 레스토랑은 ArrayList에 메뉴를 넣어주고 있는 형식이다.

두 번째 레스토랑은 built-in List를 사용하여 메뉴를 보여주고 있다.

위 레스토랑과 getMenuItems() 함수명은 동일하지만 리턴 타입이 다르다.

 

서로 다른 리턴 타입을 가지고 있는 두 레스토랑의 메뉴를 모두 가져오기 위해서 어떻게 해야할까?

처음에는 아래와 같이 각각 받아와서 loop를 돌아 모든 메뉴를 출력할 수 있다.

하지만 이 코드는 interface가 아닌 concrete한 implementation이다.

또한 한 레스토랑의 메뉴리스트 자료 구조가 변경되면, 많은 코드를 수정해야 한다.

똑같은 일을 하고 있지만 타입이 다르다는 이유로 중복된 코드를 양산하고 있다.

 

 

문제 해결

Iterator interface 사용

외부에 어떤 자료구조를 사용하는 지 노출하지 않고 루프를 돌 수 있다.

코드 중복이 감소된 것을 확인할 수 있다. 

 

Java의 iterator 사용 & 확장

java에서 제공하는 collections 자료구조를 이용한다면 built-in iterator 변경할 수 있다.

remove가 추가되어서 작성해주어야 한다.

interface Menu를 이용해서 Waitress가 레스토랑 타입을 직접적으로 알 필요가 없어진다.

 

※ List 자료구조를 사용하는 경우 ListIterator 사용할 수 있다 (앞 뒤로 이동할 수 있다)

 

 

Iterator Pattern

 

aggregate object의 구조를 노출시키지 않으면서 각각의 element를 접근할 수 있는 패턴

Cursor라고도 알려져 있다. (DB 개념에서의 Cursor)

 

Aggregate와 iterator interface를 통해 single responsibility를 만족하고 cohesion을 높게 할 수 있다. 

(Aggregate 부분은 Factory method 패턴을 이용)

 

 

반응형