728x90
Overview
행동 패턴, 컬렉션 메서드를 노출하지 않고 해당 집합의 모든 항목에 액세스할 수 있는 방법을 제공하는 패턴
Iterator Pattern의 사용은 그 안의 아이템에서 할 수 있지만, 반복할 수 있습니다.
반복자
집계의 요소를 순서대로 검색하는 인터페이스 정의
A가 List 형식이고 B가 Array라고 가정합니다.
이때 Iterator 패턴을 사용하면 하나의 인터페이스를 사용하여 두 집합을 검색할 수 있습니다.
각 집합을 구성하는 클래스는 반복자가 있는 인터페이스를 상속합니다.
hasNext()는 다음 항목이 있는지 확인하는 메서드입니다.
next()를 통해 현재 항목을 얻을 수 있습니다.
Structure

Code Example
package com.example.design.pattern;
import java.util.ArrayList;
interface Iterator {
boolean hasNext();
Object next();
void remove();
}
class MenuItem {
String name;
String description;
boolean vegetarian;
double price;
public MenuItem(String name, String description, boolean vegetarian, double price) {
super();
this.name = name;
this.description = description;
this.vegetarian = vegetarian;
this.price = price;
}
public String getName() {
return this.name;
}
}
class DinnerMenuIterator implements Iterator {
MenuItem[] menuItems;
int position = 0;
public DinnerMenuIterator(MenuItem[] menuItems) {
this.menuItems = menuItems;
}
@Override
public boolean hasNext() {
if (position >= menuItems.length || menuItems[position] == null)
return false;
else
return true;
}
@Override
public Object next() {
MenuItem menuItem = menuItems[position];
position++;
return menuItem;
}
@Override
public void remove() {
if (position <= 0) {
throw new IllegalStateException("You can't remove blah blah");
}
menuItems[position] = null;
}
}
interface Menu {
public Iterator createIterator();
}
class DinnerMenu implements Menu {
MenuItem[] menuItems = new MenuItem[100];
public MenuItem[] getMenuItmes() {
return menuItems;
}
@Override
public Iterator createIterator() {
return new DinnerMenuIterator(menuItems);
}
public void addItem(MenuItem menuItem) {
for (int i = 0; i < menuItems.length; i++) {
if (menuItems[i] == null) {
menuItems[i] = menuItem;
break;
}
}
}
}
class PancakeHouseMenuIterator implements Iterator {
ArrayList<MenuItem> menuItems;
int position = 0;
public PancakeHouseMenuIterator(ArrayList<MenuItem> menuItems) {
this.menuItems = menuItems;
}
@Override
public boolean hasNext() {
if (position >= menuItems.size())
return false;
else
return true;
}
@Override
public Object next() {
MenuItem menuItem = menuItems.get(position);
position++;
return menuItem;
}
@Override
public void remove() {
if (position <= 0) {
throw new IllegalStateException("You can't remove blah blah");
}
menuItems.remove(position);
}
}
class PancakeHouseMenu implements Menu {
ArrayList<MenuItem> menuItems = new ArrayList<>();
public ArrayList<MenuItem> getMenuItmes() {
return menuItems;
}
@Override
public Iterator createIterator() {
return new PancakeHouseMenuIterator(menuItems);
}
public void addItem(MenuItem menuItem) {
menuItems.add(menuItem);
}
}
class Waitress {
Menu pancakeHouseMenu;
Menu dinnerMenu;
public Waitress(Menu pancakeHouseMenu, Menu dinnerMenu) {
this.pancakeHouseMenu = pancakeHouseMenu;
this.dinnerMenu = dinnerMenu;
}
public void printMenu() {
Iterator pancakeHouseMenuIterator = pancakeHouseMenu.createIterator();
Iterator dinnerMenuIterator = dinnerMenu.createIterator();
printMenu(pancakeHouseMenuIterator);
printMenu(dinnerMenuIterator);
}
private void printMenu(Iterator iterator) {
while (iterator.hasNext()) {
MenuItem menuItem = (MenuItem) iterator.next();
System.out.println(menuItem.getName());
}
}
}
public class MyIterator {
public static void main(String[] args) {
PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
pancakeHouseMenu.addItem(new MenuItem("pancake1", "pancake", true, 1));
pancakeHouseMenu.addItem(new MenuItem("pancake2", "pancake", true, 1));
DinnerMenu dinnerMenu = new DinnerMenu();
dinnerMenu.addItem(new MenuItem("dinner1", "dinner", false, 2));
dinnerMenu.addItem(new MenuItem("dinner2", "dinner", false, 2));
Waitress waitress = new Waitress(pancakeHouseMenu, dinnerMenu);
waitress.printMenu();
}
}
Console Result
pancake1
pancake2
dinner1
dinner2
Conclusion
N/A
728x90
'Java Design Pattern' 카테고리의 다른 글
[ENG][디자인패턴]Singleton 패턴 이론과 설명 (0) | 2022.06.01 |
---|---|
[ENG][디자인패턴]Observer 패턴 이론과 설명 (0) | 2022.05.31 |
[ENG][디자인패턴]MVC 패턴 이론과 설명 (0) | 2022.05.30 |
[ENG][디자인패턴]Mediator 패턴 이론과 설명 (0) | 2022.05.27 |
[ENG][디자인패턴]Factory Method 패턴 이론과 설명 (0) | 2022.05.26 |
[ENG][디자인패턴]Decorator 패턴 이론과 설명 (0) | 2022.05.25 |
[ENG][디자인패턴]Builder 패턴 이론과 설명 (0) | 2022.05.24 |
[ENG][디자인패턴]Bridge 패턴 이론과 설명 (0) | 2022.05.24 |