欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

迭代器模式(Iterator)

程序员文章站 2022-07-16 18:01:49
...

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