迭代器模式(Iterator)

1、概念

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

2、模式结构

  • 抽象迭代器(Iterator):此抽象角色定义出遍历元素所需的接口
  • 具体迭代器(ConcreteIterator):此角色实现了Iterator接口,并保持迭代过程中的游标位置
  • 抽象容器(Aggregate):容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似createIterator()这样的方法,在Java中一般是iterator()方法
  • 具体容器(ConcreteAggregate):实现容器接口定义的方法,创建出容纳迭代器的对象

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());
}
原文地址:https://www.cnblogs.com/fomin/p/9993734.html