迭代器模式(Iterator)

一、概念

迭代器模式提供一種方法順序訪問一個聚合對象中各個元素,而又不需暴露該對象的內部表示,屬於行爲模式的一種 bash

圖片

二、模式結構

  • 抽象迭代器(Iterator):此抽象角色定義出遍歷元素所需的接口
  • 具體迭代器(ConcreteIterator):此角色實現了Iterator接口,並保持迭代過程當中的遊標位置
  • 抽象容器(Aggregate):容器角色負責提供建立具體迭代器角色的接口,必然提供一個相似createIterator()這樣的方法,在Java中通常是iterator()方法
  • 具體容器(ConcreteAggregate):實現容器接口定義的方法,建立出容納迭代器的對象

三、使用場景

  • 訪問一個聚合對象的內容而無須暴露它的內部表示
  • 須要爲聚合對象提供多種遍歷方式
  • 爲遍歷不一樣的聚合結構提供一個統一的接口(支持多態迭代化)

四、優缺點

優勢:ide

  • 它支持以不一樣的方式遍歷一個聚合對象
  • 迭代器簡化了聚合類
  • 在同一個聚合上能夠有多個遍歷
  • 在迭代器模式中,增長新的聚合類和迭代器類都很方便,無須修改原有代碼

缺點:ui

因爲迭代器模式將存儲數據和遍歷數據的職責分離,增長新的聚合類須要對應增長新的迭代器類,類的個數成對增長,這在必定程度上增長了系統的複雜性spa

五、實例

定義抽象迭代器Iteratorcode

public interface Iterator<T> {
    boolean hasNext();

    T first();

    T next();
}
複製代碼

定義具體迭代器FilmMenuIteratorcdn

public class FilmMenuIterator implements Iterator<MenuItem> {

    private List<MenuItem> menuItems;
    private int position = 0;

    public FilmMenuIterator(List<MenuItem> itemList) {
        menuItems = itemList;
    }

    @Override
    public boolean hasNext() {
        if (position > menuItems.size() - 1 || menuItems.get(position) == null) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public MenuItem first() {
        return menuItems.size() > 0 ? menuItems.get(0) : null;
    }

    @Override
    public MenuItem next() {
        MenuItem menuItem = menuItems.get(position);
        position++;
        return menuItem;
    }
}
複製代碼

定義抽象容器MenuAggregate對象

public interface MenuAggregate<T> {
    void addItem(int id, String name);

    Iterator<T> create();
}
複製代碼

定義具體容器FilmAggregateblog

public class FilmAggregate implements MenuAggregate<MenuItem> {

    private List<MenuItem> menuItems;

    public FilmAggregate() {
        menuItems = new ArrayList<>();
    }

    @Override
    public void addItem(int id, String name) {
        menuItems.add(new MenuItem(id, name));
    }

    @Override
    public Iterator<MenuItem> create() {
        return new FilmMenuIterator(menuItems);
    }
}
複製代碼

客戶端實現接口

FilmAggregate film = new FilmAggregate();
film.addItem(1, "西紅柿首富");
film.addItem(2, "兄弟");
film.addItem(2, "反貪風暴");
Iterator it = film.create();
while(it.hasNext()){
    System.out.println(it.next().toString());
}
複製代碼
相關文章
相關標籤/搜索