[디자인 모드] 교체 기 (Iterator)

5365 단어
교체 기 는 대상 의 바 텀 실현 을 노출 하지 않 고 취 합 대상 요 소 를 연속 으로 방문 하 는 방법 을 제공 하 는 것 으로 정의 된다.
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) 에 서 는 교체 기 를 계속 사용 합 니 다.

좋은 웹페이지 즐겨찾기