문제 정의
한 마을에 두 개의 레스토랑이 있는데 두 레스토랑을 합치려고 한다.
다행히도 두 레스토랑은 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 패턴을 이용)
'💻 개발IT > Design Patterns' 카테고리의 다른 글
4. Creational 패턴 - Abstract Factory Method Pattern (0) | 2022.03.02 |
---|---|
4. Creational 패턴 - Factory Method Pattern (0) | 2022.03.02 |
3. Behavior 패턴 - Mediator Pattern (0) | 2022.03.01 |
3. Behavior 패턴 - State Pattern (0) | 2022.03.01 |
3. Behavior 패턴 - Template Method Pattern (0) | 2022.02.28 |
3. Behavior 패턴 - Observer Pattern (0) | 2022.02.27 |
3. Behavior 패턴 - Strategy Pattern (0) | 2022.02.27 |
2. 객체지향 개념과 설계원칙 - GRASP Principle (0) | 2022.02.24 |