迭代器模式(Iterator)

2018-11-21  本文已影响2人  fomin

1、概念

迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示,属于行为模式的一种


图片

2、模式结构

3、使用场景

4、优缺点

优点:

缺点:

由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性

5、实例

定义抽象迭代器Iterator

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

    T first();

    T next();
}

定义具体迭代器FilmMenuIterator

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();
}

定义具体容器FilmAggregate

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());
}
上一篇 下一篇

猜你喜欢

热点阅读