이터레이터 패턴은 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공합니다. (캡슐화)
'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