[디자인 모드] 교체 기 (Iterator)
Provide a way to access the elements of an aggregate objectsequentially withoutexposing its underlying representation。
정 의 를 통 해 알 수 있 듯 이 Iterator 는 세 가지 키워드 가 있 는데 먼저 집합 대상 (aggregate object) 이 고 에서 정 의 를 내 렸 다.
When we say COLLECTION we just mean a group of objects. They might be stored in very different data structures lik e lists, arrays, hashtables, but they're still collections. We also sometimes call these AGGREGATE.
쉽게 말 하면 용 기 는 중합 대상 이다.
두 번 째 키 워드 는 연속 (sequentially) 입 니 다. 교체 기 는 현재 방문 할 요 소 를 추적 할 수 있어 야 합 니 다.
세 번 째 키 워드 는 노출 (exposing) 이다. 교체 기 는 대상 의 취 합 방식 을 숨 겼 다. 즉, 교체 기 를 사용 하 는 고객 은 대상 의 취 합 방식 이 배열 인지 목록 인지 알 수 없다 는 것 이다.
교체 기 모델 의 관건 은 단일 책임 (Single Responsibility) 의 디자인 원칙 을 따 르 는 것 이다.
The key idea in this pattern is to take the responsibility for access and traversal out of the list object and put it into aniterator object. --
Assign each responsibility to one class and only one class. --
단일 책임 은 iterator 로 하여 금 방문 요소 의 임 무 를 더욱 집중 적 으로 완성 하 게 할 수 있 기 때문에 클 라 이언 트 코드 를 바 꾸 지 말 아야 하 는 전제 에서 다양한 방문 방식 을 실현 하고 통 일 된 방문 방식 을 제공 할 수 있다.
교체 기 는 집합 대상 의 확장 으로 볼 수 있다.
An iterator can be viewed as an extension of the aggregate that created it.
교체 기의 내용 이 너무 많아 서 외부 와 internal 로 나 뉜 다.외부 에 서 는 클 라 이언 트 가 교체 되 어야 하고 내부 에 서 는 하나의 방법 만 호출 하면 됩 니 다. 교체 과정 은 모두 클 라 이언 트 에 대해 투명 합 니 다.
예 를 들 어 설명 하 다.
우선 교체 기의 인터페이스 Interator 를 정의 합 니 다.
public interface Iterator {
boolean hasNext();
Object next();
}
반복 되 는 형식, 메뉴 항목 이 필요 합 니 다.
메뉴 항목 이 저 장 된 메뉴 를 정의 합 니 다.
다른 메뉴 정의
메뉴 교체 기
public class MenuItem {
String name;
String description;
boolean vegetarian;
double price;
public MenuItem(String name,
String description,
boolean vegetarian,
double price) {
this.name = name;
this.description = description;
this.vegetarian = vegetarian;
this.price = price;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public double getPrice() {
return price;
}
public boolean isVegetarian() {
return vegetarian;
}
}
public class DinerMenu {
static final int MAX_ITEMS = 6;
int numberOfItems = 0;
MenuItem[] menuItems;
public DinerMenu() {
menuItems = new MenuItem[MAX_ITEMS];
addItem("Vegetarian BLT",
"(Fakin') Bacon with lettuce & tomato on whole wheat", true, 2.99);
addItem("BLT",
"Bacon with lettuce & tomato on whole wheat", false, 2.99);
addItem("Soup of the day",
"Soup of the day, with a side of potato salad", false, 3.29);
addItem("Hotdog",
"A hot dog, with saurkraut, relish, onions, topped with cheese",
false, 3.05);
//a couple of other Diner Menu items added here
}
public void addItem(String name, String description,
boolean vegetarian, double price) {
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
if (numberOfItems >= MAX_ITEMS) {
System.err.println("Sorry, menu is full! Can't add item to menu");
} else {
menuItems[numberOfItems] = menuItem;
numberOfItems = numberOfItems + 1;
}
}
// public MenuItem[] getMenuItems() {
// return menuItems;
// }
public Iterator createIterator() {
return new DinerMenuIterator(menuItems);
}
// other menu methods here
}
테스트 코드
import java.util.ArrayList;
public class PancakeHouseMenu {
ArrayList menuItems;
public PancakeHouseMenu() {
menuItems = new ArrayList();
addItem("K&B's Pancake Breakfast",
"Pancakes with scrambled eggs, ant toast",
true,
2.99);
addItem("Regular Pancake Breakfast",
"Pancakes with fired eggs, sausage",
false,
2.99);
addItem("Blueberry Pancakes",
"Pancakes made with fresh bluebarries",
true,
3.49);
addItem("Waffles",
"Waffles, with your choice of blueberries or strawberries",
true,
3.59);
}
public void addItem(String name, String description,
boolean vegetarian, double price) {
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
menuItems.add(menuItem);
}
// public ArrayList getMenuItems() {
// return menuItems;
// }
public Iterator createIterator() {
return new PancakeMenuIterator(menuItems);
}
// other menu methods here
}
코드 를 통 해 알 수 있 듯 이 클 라 이언 트 코드 Waitress 의 코드 는 모든 메뉴 대상 내부 의 집적 상황 에 관심 을 가지 지 말고 해당 하 는 스 트 리밍 기 를 호출 하면 됩 니 다.
다음 조합 모드 (Composite) 에 서 는 교체 기 를 계속 사용 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.