[DesignPattern] IteratorPattern
이터레이터 패턴은 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공합니다. (캡슐화)
Behavior Pattern (행동 관련 패턴)
- 클래스와 객체들이 상호작용하는 방법 및 역할을 분담하는 방법과 관련된 패턴
Iterator Pattern (반복자 패턴)
- 모든 항목에 일일이 접근하는 작업을 컬렉션 객체가 아닌 반복자 객체에서 맡게 됩니다.
- 이것은 집합체의 인터페이스 및 구현이 간단해질 뿐만 아니라, 집합체에서는 반복 작업에서 손을 떼고 원래 자신이 할 일에만 전념할 수 있습니다.
예시
'1차열 배열로 메뉴판을 구현한 A 가게 & ArrayList로 메뉴판을 구현한 B 가게'가 있습니다. 두 가게가 병합하여 한 명의 직원이 서빙을 할 때, 데이터를 읽어오는 방법을 구현해야 합니다.
- 이터레이터 패턴을 사용하지 않은 경우 서빙 알바의 코드
public class Waitress {
PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
ArrayList breakfastItems = pancakeHouseMenu.getMenuItems();
DinerMenu dinerMenu = DinerMenu();
MenuItem[] lunchItems = dinerMenu.getMenuItems();
//ArrayList 데이터를 읽어오는 방식으로 B가게 메뉴를 가져옵니다.
for(int i = 0; i < breakfastItems.size(); i++) {
MenuItem menuItem = (MenuItem)breakfastItems.get(i);
System.out.print(menuItem.getName() + " ");
System.out.println(menuItem.getPrice() + " ");
System.out.println(menuItem.getDescription() + " ");
}
//1차원 배열의 데이터를 읽어오는 방식으로 A가게 메뉴를 가져옵니다.
for(int i = 0; i < lunchItems.length; i++) {
MenuItem menuItem = lunchItmes[i];
System.out.print(menuItem.getName() + " ");
System.out.println(menuItem.getPrice() + " ");
System.out.println(menuItem.getDescription() + " ");
}
}
- 이터레이터 패턴 적용한 경우 서빙 알바의 코드
public class Waitress {
PancakeHouseMenu pancakeHouseMenu;
DinerMenu dinerMenu;
public Waitress(PancakeHouseMenu pancakeHouseMenu, DinerMenu dinerMenu) {
this.pancakeHouseMenu = pancakeHouseMenu;
this.dinerMenu = dinerMenu;
}
public void printMenu() {
Iterator pancakeIterator = pancakeHouseMenu.createIterator();
Iterator dinerIterator = dinerMenu.createIterator();
System.out.println("메뉴\n----\n아침메뉴")
printMenu(pancakeIterator);
System.out.println("\n점심메뉴");
printMenu(dinerIterator);
}
private void printMenu(Iterator iterator) {
while (iterator.hasNext()) {
MenuItem menuItem = (MenuItem)iterator.next();
System.out.print(menuItem.getName() + ", ");
System.out.print(menuItem.getPrice() + " -- ");
System.out.println(menuItem.getDescription());
}
}
}
차이점
위의 코드를 비교해보면 서빙 직원이 데이터를 읽어오는 작업을 따로 하지 않고 Iterator가 던져준 데이터를 보여주는 것을 확인할 수 있습니다. 이것은 모든 서빙 직원이 읽어오는 방식을 하나로 통일 할 수 있으며, 잘못 읽어오는 버그가 생긴 경우에 이것을 뿌려주는 반복자 하나만 확인하면 쉽게 유지보수를 할 수 있다는 장점을 가져올 수 있습니다.
코틀린으로 이터레이터 패턴 보기
https://github.com/sgmsgood/DesignPattern_Kotlin/tree/master/IteratorDesign/src/main/kotlin
Author And Source
이 문제에 관하여([DesignPattern] IteratorPattern), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@developerelen/DesignPattern-IteratorPattern저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)