๐ก ์ดํฐ๋ ์ดํฐ ํจํด (Iterator Pattern)
์ปฌ๋ ์ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ ธ์ถ์ํค์ง ์์ผ๋ฉด์๋ ๊ทธ ์งํฉ์ฒด ์์ ๋ค์ด์๋ ๋ชจ๋ ํญ๋ชฉ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
โ ์์ : ๋ ์คํ ๋ ํฉ๋ณ
Steak ๋ ์คํ ๋๊ณผ Burger ๋ ์คํ ๋์ ํฉ๋ณ์ด ๊ฒฐ์ ๋์๋ค. ๋ ๋ ์คํ ๋์ด ํฉ๋ณํ๋ฉด์ ๋ฉ๋ด๋ฅผ ํต์ผํํ๊ณ ํ๋งคํ๊ธฐ๋ก ํ๋ค.
(1) ๋ฌธ์ ์ธ์
1. ๋ ๋ ์คํ ๋์ด ํฉ์ํ ๋ฉ๋ด ํญ๋ชฉ : MenuItem
/**
* ๋ ๊ฐ๊ฒ์ ํฉ์ํ ๋ฉ๋ด
*/
public class MenuItem {
String name; // ๋ฉ๋ด๋ช
String description; // ๋ฉ๋ด์ค๋ช
boolean vegetarian; // ๋ฒ ์งํ
๋ฆฌ์ธ ์ฌ๋ถ
Long price; // ๊ฐ๊ฒฉ
public MenuItem(String name, String description, Boolean vegitarian, Long price) {
this.name = name;
this.description = description;
this.vegetarian = vegitarian;
this.price = price;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public boolean isVegetarian() {
return vegetarian;
}
public Long getPrice() {
return price;
}
@Override
public String toString() {
return "MenuItem{" +
"name='" + name + '\'' +
", description='" + description + '\'' +
", vegetarian=" + vegetarian +
", price=" + price +
'}';
}
}
2. ๊ฐ ๋ ์คํ ๋์ ๋ฉ๋ด
/**
* ์คํ
์ดํฌ ๋ฉ๋ด : ๋ฐฐ์ด
*/
public class SteakMenu {
public static final int MAX_ITEMS = 5; // ์ต๋ ๋ฉ๋ด ๊ฐฏ์ 5๊ฐ
int numberOfItems = 0;
MenuItem[] menuItemList;
public SteakMenu() {
menuItemList = new MenuItem[MAX_ITEMS];
addMenu("์์ฌ ์คํ
์ดํฌ", "์์ฌ์คํ
์ดํฌ, ๊ตฌ์ด๋ฒ์ฏ, ๊ตฌ์ด์ํ", false, 18000);
addMenu("T๋ณธ ์คํ
์ดํฌ", "T๋ณธ ์คํ
์ดํฌ, ๊ตฌ์ดํ์ธ์ ํ, ๊ตฌ์ด๋ฒ์ฏ", false, 20000);
addMenu("๋ฑ์ฌ ์คํ
์ดํฌ", "๋ฑ์ฌ์คํ
์ดํฌ, ๊ตฌ์ด๋ง๋, ๊ตฌ์ด๊ฐ์", false, 15000);
addMenu("์ฑ๋ ์คํ
์ดํฌ", "์ฑ๋์คํ
์ดํฌ, ๊ตฌ์ด๋ง๋, ๊ตฌ์ด์์คํ๋ผ๊ฑฐ์ค", false, 12000);
addMenu("์ฝฉ๊ณ ๊ธฐ ์คํ
์ดํฌ", "์ฝฉ๊ณ ๊ธฐ์คํ
์ดํฌ, ๊ตฌ์ด์์คํ๋ผ๊ฑฐ์ค, ๊ตฌ์ด์ํ, ๊ตฌ์ดํ์ธ์ ํ", true, 17000);
}
public void addMenu(String name, String description, boolean vegietarian, long price) {
MenuItem menuItem = new MenuItem(name, description, vegietarian, price);
if (numberOfItems >= MAX_ITEMS) {
System.err.println("๋ฑ๋กํ ์ ์๋ ๋ฉ๋ด ๊ฐฏ์๋ฅผ ์ด๊ณผํ์ต๋๋ค.");
} else {
menuItemList[numberOfItems] = menuItem;
numberOfItems += 1;
}
}
public MenuItem[] getMenuItemList() {
return menuItemList;
}
}
/**
* ํ๋ฒ๊ฑฐ ๋ฉ๋ด : ๋ฆฌ์คํธ
*/
public class BurgerMenu {
List<MenuItem> menuItemList;
public BurgerMenu() {
menuItemList = new ArrayList<>();
addItem("๋จธ์ฌ๋ฃธ๋ฒ๊ฑฐ", "๋ฒ์ฏ, ์ฝฉ์ด ์ฌ๋ฃ์ธ ํจํฐ๋ก ๋ง๋ ๋ฒ๊ฑฐ", true, 8000);
addItem("์นํจ๋ฒ๊ฑฐ", "์นํจ ๋ค๋ฆฌ์ด๋ก ๋ง๋ ๋ฒ๊ฑฐ", false, 9000);
addItem("ํ์ฐ๋ฒ๊ฑฐ", "1++ ํ์ฐ๋ก ๋ง๋ ๋ฒ๊ฑฐ", false, 15000);
addItem("์์ฐ๋ฒ๊ฑฐ", "์์ฐ๊ฐ ๋ฌ๋ฟ ๋ค์ด๊ฐ ๋ฒ๊ฑฐ", false, 10000);
addItem("์ผ์ฑ๋ฒ๊ฑฐ", "์ผ์ฑ๋ฅผ ํ๊ฒจ ๋ง๋ ๋ฒ๊ฑฐ", true, 7000);
}
public void addItem(String name, String description, boolean vegetarian, long price) {
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
menuItemList.add(menuItem);
}
public List<MenuItem> getMenuItemList() {
return menuItemList;
}
@Override
public String toString() {
return "burgerMenu{" +
"menuItemList=" + menuItemList +
'}';
}
}
๋ ๊ฐ๊ฒ๋ ๋ฉ๋ด ๊ตฌํ ๋ฐฉ์์ด ๋ค๋ฅด๋ค. Steak ๋ ๋ฐฐ์ด์ Burger ์ ๋ฆฌ์คํธ๋ก ๋ฉ๋ด๋ฅผ ๊ตฌํํ๊ณ ์๋ค. ์ด๋ ๊ฒ ๊ตฌํ ๋ฐฉ์์ด ๋ค๋ฅด๋ฉด ๊ฐ ํ์ ์ ๋ง์ถฐ ๋ ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ด ์์ฑ๋์ผ ํ๋ ๋ฌธ์ ๊ฐ๋ฐ์ํ๋ค.
3. ๋ ๋ฉ๋ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ํด๋์ค (์ ์) : Clerk
public class Clerk {
SteakMenu steakMenu; // Array
BurgerMenu burgerMenu; // List
public Clerk(SteakMenu steakMenu, BurgerMenu burgerMenu) {
this.steakMenu = steakMenu;
this.burgerMenu = burgerMenu;
}
public void printMenu() {
System.out.println("===== Steak Menu =====");
printMenu(steakMenu.getMenuItemList());
System.out.println("===== Burger Menu =====");
printMenu(burgerMenu.getMenuItemList());
}
// ๋ฐฐ์ด๋ก ๋ Steak ๋ฉ๋ด ์ถ๋ ฅ๋ฐฉ์
public void printMenu(MenuItem[] menus) {
for (int i = 0; i < menus.length; i++) {
MenuItem menu = menus[i];
System.out.println("name = " + menu.getName() + ", price = " + menu.getPrice());
System.out.println("description = " + menu.getDescription());
}
}
// ๋ฆฌ์คํธ๋ก ๋ Burger ๋ฉ๋ด ์ถ๋ ฅ๋ฐฉ์
public void printMenu(List<MenuItem> menus) {
for (MenuItem m : menus) {
System.out.println("name = " + m.getName() + ", price = " + m.getPrice());
System.out.println("description = " + m.getDescription());
}
}
public void printVegetarianMenu() {
printVegetarianMenu(steakMenu.getMenuItemList());
printVegetarianMenu(burgerMenu.getMenuItemList());
}
// ๋ฐฐ์ด๋ก ๋ Steak ์ฑ์๋ฉ๋ด ์ถ๋ ฅ๋ฐฉ์
public void printVegetarianMenu(MenuItem[] menus) {
for (int i = 0; i < menus.length; i++) {
MenuItem menu = menus[i];
if (menu.isVegetarian()) {
System.out.println("name = " + menu.getName() + ", price = " + menu.getPrice());
System.out.println("description = " + menu.getDescription());
}
}
}
// ๋ฆฌ์คํธ๋ก ๋ Burger ์ฑ์๋ฉ๋ด ์ถ๋ ฅ๋ฐฉ์
public void printVegetarianMenu(List<MenuItem> menus) {
for (MenuItem m : menus) {
if (m.isVegetarian()) {
System.out.println("name = " + m.getName() + ", price = " + m.getPrice());
System.out.println("description = " + m.getDescription());
}
}
}
public boolean isItemVegetarian(String name) {
MenuItem[] steakMenus = steakMenu.getMenuItemList();
List<MenuItem> burgerMenus = burgerMenu.getMenuItemList();
if (isVegetarian(name, steakMenus)) {
return true;
}
if (isVegetarian(name, burgerMenus)) {
return true;
}
return false;
}
// ๋ฐฐ์ด๋ก ๋ Steak ๋ฉ๋ด์ ์ฑ์์ฌ๋ถ ํ์ธ ๋ฉ์๋
private boolean isVegetarian(String name, MenuItem[] menus) {
for (int i = 0; i < menus.length; i++) {
MenuItem menuItem = menus[i];
if (menuItem.getName().equals(name)) {
if (menuItem.isVegetarian()) {
return true;
}
}
}
return false;
}
// ๋ฆฌ์คํธ๋ก ๋ Burger ๋ฉ๋ด์ ์ฑ์์ฌ๋ถ ํ์ธ ๋ฉ์๋
private boolean isVegetarian(String name, List<MenuItem> menuItemLists) {
for (MenuItem m : menuItemLists) {
if (m.getName().equals(name)) {
if (m.isVegetarian()) {
return true;
}
}
}
return false;
}
}
(2) ๋ฌธ์ ์
Steak ์ Burger ์ ๊ตฌํ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ๊ฐ ๋ฐฉ์์ ๋ง๊ฒ ํด๊ฒฐํด์ค์ผ ํ๋ค.
์ฆ, ๊ฐ๊ฐ์ ๋ํ ๋๊ฐ์ ์ฒ๋ฆฌ (๋ฐ๋ณต) ๋ฅผ ์บก์ํํ์ฌ ๋ฐ๋ณต์ ์ธํฐํ์ด์ค๋ก ํด๊ฒฐํด๋ณด์.
(3) ๋ฌธ์ ํด๊ฒฐ
1. Menu ์ธํฐํ์ด์ค ์์ฑ
public interface Menu {
public Iterator createIterator();
}
2. Steak ๋ฉ๋ด์ Burger ๋ฉ๋ด์ ๊ตฌํ
/**
* ์คํ
์ดํฌ ๋ฉ๋ด : Array, Menu ์ธํฐํ์ด์ค ์ฌ์ฉ
*/
public class SteakMenu implements Menu {
// ์ธ์คํด์ค, ์์ฑ์ ์๋ต (๊ธฐ์กด๊ณผ ๋์ผ)
// getter ๋ ์ญ์ ํ์. ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ค ๋๋ฌ๋ด๊ธฐ๋๋ฌธ์ ๋ถํ์ํ๋ค.
// public MenuItem[] getMenuItemList() {
// return menuItemList;
// }
@Override
public Iterator createIterator() {
// ์คํ
์ดํฌ ๋ฉ๋ด Iterator ์์ฑ
return new SteakMenuIterator(menuItemList);
}
}
/**
* ํ๋ฒ๊ฑฐ ๋ฉ๋ด : ArrayList, Menu ์ธํฐํ์ด์ค ์ฌ์ฉ
*/
public class BurgerMenu implements Menu {
// ์ธ์คํด์ค, ์์ฑ์ ์๋ต (๊ธฐ์กด๊ณผ ๋์ผ)
// getter ๋ ์ญ์ ํ์. ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ค ๋๋ฌ๋ด๊ธฐ๋๋ฌธ์ ๋ถํ์ํ๋ค.
// public List<MenuItem> getMenuItemList() {
// return menuItemList;
// }
@Override
public Iterator createIterator() {
// ๋ฒ๊ฑฐ ๋ฉ๋ด Iterator ์์ฑ
return new BurgerMenuIterator(menuItemList);
}
}
3. ๋ฐฐ์ด๊ณผ ๋ฆฌ์คํธ์ ๋ด๋ถ๊ตฌ์กฐ๋ฅผ ํ๋๋ก ์บก์ํ ํ Iterator ์ธํฐํ์ด์ค ์์ฑ
public interface Iterator {
boolean hasNext();
MenuItem next();
}
4. Iterator ๋ฅผ ๊ตฌํํ๋ ๋ฐฐ์ด์ฉ ๋ฐ๋ณต์ (ArrayIterator) , ๋ฆฌ์คํธ์ฉ ๋ฐ๋ณต์ (ArrayListIterator) ์์ฑ
// ๋ฐฐ์ด์ฉ ๋ฐ๋ณต์
public class ArrayIterator implements Iterator {
MenuItem[] menuItems;
int position;
public ArrayIterator(MenuItem[] menuItems) {
this.menuItems = menuItems;
}
@Override
public boolean hasNext() {
if (position >= menuItems.length || menuItems[position] == null) {
return false;
} else {
return true;
}
}
@Override
public MenuItem next() {
MenuItem menuItem = menuItems[position];
position += 1;
return menuItem;
}
}
// ๋ฆฌ์คํธ์ฉ ๋ฐ๋ณต์
public class ArrayListIterator implements Iterator {
ArrayList<MenuItem> menuItemList;
int position;
public ArrayListIterator(ArrayList<MenuItem> menuItems) {
this.menuItemList = menuItems;
}
@Override
public boolean hasNext() {
if (position >= menuItemList.size()) {
return false;
} else {
return true;
}
}
@Override
public MenuItem next() {
MenuItem menuItem = menuItemList.get(position);
position += 1;
return menuItem;
}
}
5. ํด๋ผ์ด์ธํธ
public class Clerk {
Menu steakMenu;
Menu burgerMenu;
public Clerk(Menu steakMenu, Menu burgerMenu) {
this.steakMenu = steakMenu;
this.burgerMenu = burgerMenu;
}
public void printMenu() {
Iterator stakeIterator = steakMenu.createIterator();
Iterator burgerIterator = burgerMenu.createIterator();
System.out.println("===== Steak Menu =====");
printMenu(stakeIterator);
System.out.println("===== Burger Menu =====");
printMenu(burgerIterator);
}
public void printMenu(Iterator menuIter) {
while (menuIter.hasNext()) {
MenuItem menuItem = menuIter.next();
System.out.println("name = " + menuItem.getName() + ", price = " + menuItem.getPrice());
System.out.println("description = " + menuItem.getDescription());
}
}
public void printVegetarianMenu() {
printVegetarianMenu(steakMenu.createIterator());
printVegetarianMenu(burgerMenu.createIterator());
}
public void printVegetarianMenu(Iterator iterator) {
while (iterator.hasNext()) {
MenuItem menuItem = iterator.next();
if (menuItem.isVegetarian()) {
System.out.println("name = " + menuItem.getName() + ", price = " + menuItem.getPrice());
System.out.println("description = " + menuItem.getDescription());
}
}
}
public boolean isItemVegetarian(String name) {
Iterator steakIter = steakMenu.createIterator();
Iterator burgerIter = burgerMenu.createIterator();
if (isVegetarian(name, steakIter)) {
return true;
}
if (isVegetarian(name, burgerIter)) {
return true;
}
return false;
}
private boolean isVegetarian(String name, Iterator iter) {
while (iter.hasNext()) {
MenuItem menuItem = iter.next();
if (menuItem.getName().equals(name)) {
if (menuItem.isVegetarian()) {
return true;
}
}
}
return false;
}
}
Iterator ๋ฅผ ์ด์ฉํด์ ๋ฐฐ์ด๊ณผ ๋ฆฌ์คํธ์ ๋ฐ๋ณต์๋ฅผ ์บก์ํ ํ๊ธฐ ์ ์๋ ๊ฐ ๊ตฌํ์ ๋ง๊ฒ ์์ฑํด์ค์ผํ๋ค.
- ๋ฐ๋ณต์ ์บก์ํ ์
- ๋ค์๊ณผ ๊ฐ์ด ๋ฐฐ์ด, ๋ฆฌ์คํธ๊ฐ ๊ฐ๊ฐ ์ถ๋ ฅ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ตฌํํด์ผํ ์์ค๊ฐ ๋ง์์ง๊ณ ์ง์ ๋ถํ๋ค.
- // ์ ์ฒด๋ฉ๋ด ์ถ๋ ฅ ๋ฉ์๋๋ค
public void printMenu(MenuItem[] menus) {...}
public void printMenu(List<MenuItem> menus) {...}
// ์ฑ์๋ฉ๋ด ์ถ๋ ฅ ๋ฉ์๋๋ค
public void printVegetarianMenu(MenuItem[] menus) {...}
public void printVegetarianMenu(List<MenuItem> menus) {...}
- ๋ฐ๋ณต์ ์บก์ํ ํ
- ๋ค์๊ณผ ๊ฐ์ด ๋ฐฐ์ด, ๋ฆฌ์คํธ๋ฅผ ํ๋์ ๋ฉ์๋์์ ์ถ๋ ฅํ ์ ์๋๋ก ํ ์ ์๋ค.
- // ์ ์ฒด๋ฉ๋ด ์ถ๋ ฅ ๋ฉ์๋
public void printMenu(Iterator menuIter) {...}
// ์ฑ์๋ฉ๋ด ์ถ๋ ฅ ๋ฉ์๋
public void printVegetarianMenu(Iterator iterator) {...}
์ด๋ ๊ฒ ํจ์ผ๋ก์จ ์งํฉ์ฒด ๋ด์์ ์ด๋ค ์์ผ๋ก ์ผ์ด ์ฒ๋ฆฌ๋๋์ง์ ๋ํด์ ์ ํ ๋ชจ๋ฅด๋ ์ํ์์๋ ๊ทธ ์์ ๋ชจ๋ ํญ๋ชฉ๋ค์ ๋ํด์ ๋ฐ๋ณต์์ ์ ์ํํ ์ ์๊ฒ ๋์๋ค.
โ ์๋ฐ๊ฐ ์ ๊ณตํ๋ ์ดํฐ๋ ์ดํฐ : java.util.Iterator
์ดํฐ๋ ์ดํฐ ํจํด์ ์ํด ์ง์ Iterator ๋ฅผ ์์ฑํด๋ดค์ง๋ง, java ์์ ์ ๊ณตํด์ฃผ๋ Iterator ๊ฐ ์กด์ฌํ๋ค.
1. Menu ์ธํฐํ์ด์ค
import java.util.Iterator;
public interface Menu {
public Iterator createIterator();
}
2. MenuItem ํด๋์ค
public class MenuItem {
String name; // ๋ฉ๋ด๋ช
String description; // ์ค๋ช
boolean vegetarian; // ๋ฒ ์งํ
๋ฆฌ์ธ ์ฌ๋ถ
Long price; // ๊ฐ๊ฒฉ
public MenuItem(String name, String description, Boolean vegetarian, Long price) {
this.name = name;
this.description = description;
this.vegetarian = vegetarian;
this.price = price;
}
// getter
public String getName() { return name; }
public String getDescription() { return description; }
public boolean isVegetarian() { return vegetarian; }
public Long getPrice() { return price; }
}
3. SteakMenu, BurgerMenu ํด๋์ค
import java.util.Arrays;
import java.util.Iterator;
/**
* ์คํ
์ดํฌ ๋ฉ๋ด : Array
*/
public class SteakMenu implements Menu {
public static final int MAX_ITEMS = 5; // ์ต๋ ๋ฉ๋ด ๊ฐฏ์ 5๊ฐ
int numberOfItems = 0;
MenuItem[] menuItemList;
public SteakMenu() {
menuItemList = new MenuItem[MAX_ITEMS];
addMenu("์์ฌ ์คํ
์ดํฌ", "์์ฌ์คํ
์ดํฌ, ๊ตฌ์ด๋ฒ์ฏ, ๊ตฌ์ด์ํ", false, 18000);
addMenu("T๋ณธ ์คํ
์ดํฌ", "T๋ณธ ์คํ
์ดํฌ, ๊ตฌ์ดํ์ธ์ ํ, ๊ตฌ์ด๋ฒ์ฏ", false, 20000);
addMenu("๋ฑ์ฌ ์คํ
์ดํฌ", "๋ฑ์ฌ์คํ
์ดํฌ, ๊ตฌ์ด๋ง๋, ๊ตฌ์ด๊ฐ์", false, 15000);
addMenu("์ฑ๋ ์คํ
์ดํฌ", "์ฑ๋์คํ
์ดํฌ, ๊ตฌ์ด๋ง๋, ๊ตฌ์ด์์คํ๋ผ๊ฑฐ์ค", false, 12000);
addMenu("์ฝฉ๊ณ ๊ธฐ ์คํ
์ดํฌ", "์ฝฉ๊ณ ๊ธฐ์คํ
์ดํฌ, ๊ตฌ์ด์์คํ๋ผ๊ฑฐ์ค, ๊ตฌ์ด์ํ, ๊ตฌ์ดํ์ธ์ ํ", true, 17000);
}
public void addMenu(String name, String description, boolean vegetarian, long price) {
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
if (numberOfItems >= MAX_ITEMS) {
System.err.println("๋ฑ๋กํ ์ ์๋ ๋ฉ๋ด ๊ฐฏ์๋ฅผ ์ด๊ณผํ์ต๋๋ค.");
} else {
menuItemList[numberOfItems] = menuItem;
numberOfItems += 1;
}
}
@Override
public Iterator<MenuItem> createIterator() {
// ๋ฐฐ์ด : stream ์ฌ์ฉํ Iterator
return Arrays.stream(menuItemList).iterator();
}
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* ํ๋ฒ๊ฑฐ ๋ฉ๋ด : ArrayList
*/
public class BurgerMenu implements Menu {
List<MenuItem> menuItemList;
public BurgerMenu() {
menuItemList = new ArrayList<>();
addItem("๋จธ์ฌ๋ฃธ๋ฒ๊ฑฐ", "๋ฒ์ฏ, ์ฝฉ์ด ์ฌ๋ฃ์ธ ํจํฐ๋ก ๋ง๋ ๋ฒ๊ฑฐ", true, 8000);
addItem("์นํจ๋ฒ๊ฑฐ", "์นํจ ๋ค๋ฆฌ์ด๋ก ๋ง๋ ๋ฒ๊ฑฐ", false, 9000);
addItem("ํ์ฐ๋ฒ๊ฑฐ", "1++ ํ์ฐ๋ก ๋ง๋ ๋ฒ๊ฑฐ", false, 15000);
addItem("์์ฐ๋ฒ๊ฑฐ", "์์ฐ๊ฐ ๋ฌ๋ฟ ๋ค์ด๊ฐ ๋ฒ๊ฑฐ", false, 10000);
addItem("์ผ์ฑ๋ฒ๊ฑฐ", "์ผ์ฑ๋ฅผ ํ๊ฒจ ๋ง๋ ๋ฒ๊ฑฐ", true, 7000);
}
public void addItem(String name, String description, boolean vegetarian, long price) {
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
menuItemList.add(menuItem);
}
@Override
public Iterator<MenuItem> createIterator() {
// ์๋ฐ๊ฐ ์ ๊ณตํด์ฃผ๋ Iterator
return menuItemList.iterator();
}
}
4. ํด๋ผ์ด์ธํธ Clerk
import java.util.Iterator;
public class Clerk {
Menu steakMenu;
Menu burgerMenu;
public Clerk(Menu steakMenu, Menu burgerMenu) {
this.steakMenu = steakMenu;
this.burgerMenu = burgerMenu;
}
/**
* ์ดํฐ๋ ์ดํฐ ์ฌ์ฉ
*/
public void printMenu() {
Iterator<MenuItem> steakMenuIterator = steakMenu.createIterator();
Iterator<MenuItem> burgerMenuIterator = burgerMenu.createIterator();
System.out.println("===== Steak Menu =====");
printMenu(steakMenuIterator);
System.out.println("===== Burger Menu =====");
printMenu(burgerMenuIterator);
}
public void printMenu(Iterator<MenuItem> menuItemIterator) {
while (menuItemIterator.hasNext()) {
MenuItem menuItem = menuItemIterator.next();
System.out.println("name = " + menuItem.getName() + ", price = " + menuItem.getPrice());
System.out.println("description = " + menuItem.getDescription());
}
}
public void printVegetarianMenu() {
printVegetarianMenu(steakMenu.createIterator());
printVegetarianMenu(burgerMenu.createIterator());
}
public void printVegetarianMenu(Iterator<MenuItem> iterator) {
while (iterator.hasNext()) {
MenuItem menuItem = iterator.next();
if (menuItem.isVegetarian()) {
System.out.println("name = " + menuItem.getName() + ", price = " + menuItem.getPrice());
System.out.println("description = " + menuItem.getDescription());
}
}
}
public boolean isItemVegetarian(String name) {
Iterator steakMenuIterator = steakMenu.createIterator();
Iterator burgerMenuIterator = burgerMenu.createIterator();
if (isVegetarian(name, steakMenuIterator)) {
return true;
}
if (isVegetarian(name, burgerMenuIterator)) {
return true;
}
return false;
}
private boolean isVegetarian(String name, Iterator<MenuItem> menuItemIterator) {
while (menuItemIterator.hasNext()) {
MenuItem menuItem = menuItemIterator.next();
if (menuItem.getName().equals(name)) {
if (menuItem.isVegetarian()) {
return true;
}
}
}
return false;
}
}
โ UML Diagram
๋ชจ๋ ํญ๋ชฉ์ ์ผ์ผ์ด ์ ๊ทผํ๋ ์์ ์ ๋ฐ๋ณต์ ๊ฐ์ฒด์์ ๋งก๊ฒ ๋๋ค. ์ปฌ๋ ์ ๊ฐ์ฒด ์์ ๋ค์ด์๋ ๋ชจ๋ ํญ๋ชฉ์ ์ ๊ทผํ๋ ๋ฐฉ์์ด ํต์ผ๋๋ค. ๊ทธ๋ก์ธํด ์ด๋ค ์ข ๋ฅ์ ์งํฉ์ฒด์ ๋ํด์๋ ์ฌ์ฉํ ์ ์๋ ๋คํ์ ์ธ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค. ๋ํ ์งํฉ์ฒด๋ ๋ฐ๋ณต์์ ์ ๋ํด์ ์์ ๋ผ๊ณ ์์ ์ ์ปฌ๋ ์ ๊ด๋ฆฌ์๋ง ์ ๋ ํ ์ ์๋ค.
โ ๋์์ธ ์์น : ๋จ์ผ ์ญํ ์์น
๋ง์ฝ, Iterator ๋ฅผ ๋ฐ๋ก ๋ง๋ค์ง ์๊ณ , ํด๋์ค(์์ ์์ SteakMenu, BurgerMenu์ ํด๋น) ์์ ๋ฐ๋ณต์์ฉ ๋ฉ์๋ ๊ด๋ จ๊ธฐ๋ฅ์ ์ ๋ถ ๊ตฌํํ๋ค๋ฉด ์ด๋จ๊น? ๋ฉ์๋๊ฐ ๊ฝค ๋ง์์ง๊ฒ๋๋ค. ๋ฉ์๋ ์๊ฐ ๋ง์์ง๋ค๋ ๊ฒ์ด ์ข์ง์์ ์ด์ ๊ฐ ๋ ๊น?
ํด๋์ค์์ ์๋ ๊ทธ ํด๋์ค์ ์ญํ (์งํฉ์ฒด ๊ด๋ฆฌ) ์ธ์ ๋ค๋ฅธ ์ญํ (๋ฐ๋ณต์ ๋ฉ์๋) ์ ์ฒ๋ฆฌํ๋๋ก ํ๋ฉด ๋ ๊ฐ์ง ์ด์ ๋ก ์ธํด ๊ทธ ํด๋์ค์ ๋ณ๊ฒฝ์ด ์๊ธธ ์ ์๋ค.
(1) ์ปฌ๋ ์ ์ด ์ด๋ค ์ด์ ๋ก ๋ฐ๋๊ฒ ๋๋ฉด ํด๋น ํด๋์ค์ ๋ณ๊ฒฝ์ด ์๊ธด๋ค.
(2) ๋ฐ๋ณต์ ๊ด๋ จ ๊ธฐ๋ฅ์ด ๋ฐ๋๊ฒ ๋๋ฉด ํด๋น ํด๋์ค์ ๋ณ๊ฒฝ์ด ์๊ธด๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ๋์์ธ ์์น์ด ์๋ค.
๐ ๋์์ธ ์์น : ๋จ์ผ ์ญํ ์์น
ํด๋์ค๋ฅผ ๋ฐ๊พธ๋ ์ด์ ๋ ํ ๊ฐ์ง ๋ฟ์ด์ด์ผ ํ๋ค.
ํด๋์ค๋ฅผ ๊ณ ์น๋ ๊ฒ์ ์ต๋ํ ํผํด์ผ ํ๋ค. ๋ณ๊ฒฝ์ ์์์น ๋ชปํ ์๋ง์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ ์ญํ ์ ํ ํด๋์ค์์๋ง ๋งก๋๋ก ํด์ผํ๋ค.
๐ ์์ง๋ (cohesion)
ํ ํด๋์ค ๋๋ ๋ชจ๋์ด ํน์ ๋ชฉ์ ๋๋ ์ญํ ์ ์ผ๋ง๋ ์ผ๊ด๋๊ฒ ์ง์ํ๋์ง๋ฅผ ๋ํ๋ด๋ ์ฒ๋์ด๋ค.
์ด๋ค ๋ชจ๋ ๋๋ ํด๋์ค์ ์์ง๋๊ฐ ๋๋ค๋ ๊ฒ์ ์ผ๋ จ์ ์๋ก ์ฐ๊ด๋ ๊ธฐ๋ฅ์ด ๋ฌถ์ฌ์๋ค๋ ๊ฒ์, ์์ง๋๊ฐ ๋ฎ๋ค๋ ๊ฒ์ ์๋ก ์๊ด ์๋ ๊ธฐ๋ฅ๋ค์ด ๋ฌถ์ฌ์๋ค๋ ๊ฒ์ ๋ปํ๋ค.
์์ง๋๋ ๋จ์ผ ์ญํ ์์น์์๋ง ์ฐ์ด๋ ์ฉ์ด๋ ์๋๊ณ , ์ข๋ ๊ด๋ฒ์ํ ์ฉ๋๋ก ์ฐ์ด๋ ์ฉ์ด์ด๋ค. ํ์ง๋ง ๊ทธ ๋์ ์๋ก ๋ฐ์ ํ๊ฒ ์ฐ๊ด๋์ด ์๋ค. ์ด ์์น์ ์ ๋ฐ๋ฅด๋ ํด๋์ค๋ ๋ ๊ฐ ์ด์์ ์ญํ ์ ๋งก๊ณ ์๋ ํด๋์ค์ ๋นํด ์์ง๋๊ฐ ๋๊ณ , ๊ด๋ฆฌํ๊ธฐ๋ ๋ ์ฉ์ดํ ํธ์ด๋ค.
์ฐธ๊ณ
ํค๋ ํผ์คํธ ๋์์ธ ํจํด (Head First Design Patterns) - ์๋ฆญ ํ๋ฆฌ๋จผ,์๋ฆฌ์๋ฒ ์ค ๋กญ์จ,์ผ์ด์ ์์๋ผ,๋ฒํธ ๋ฒ ์ด์ธ