Overview

행동 패턴, 컬렉션 메서드를 노출하지 않고 해당 집합의 모든 항목에 액세스할 수 있는 방법을 제공하는 패턴
Iterator Pattern의 사용은 그 안의 아이템에서 할 수 있지만, 반복할 수 있습니다.

반복자
집계의 요소를 순서대로 검색하는 인터페이스 정의

A가 List 형식이고 B가 Array라고 가정합니다.
이때 Iterator 패턴을 사용하면 하나의 인터페이스를 사용하여 두 집합을 검색할 수 있습니다.

각 집합을 구성하는 클래스는 반복자가 있는 인터페이스를 상속합니다.
hasNext()는 다음 항목이 있는지 확인하는 메서드입니다.
next()를 통해 현재 항목을 얻을 수 있습니다.

 

Structure

https://ko.wikipedia.org/wiki/%EB%B0%98%EB%B3%B5%EC%9E%90_%ED%8C%A8%ED%84%B4

 

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

+ Recent posts