迭代器模式浅谈

81 阅读2分钟

「这是我参与2022首次更文挑战的第36天,活动详情查看:2022首次更文挑战」。

一、什么是迭代器模式

迭代器模式:提供一个对象来顺序访问聚合对象内部的数据,而不暴露聚合对象内部。常见的运用有集合访问中的迭代器,就是实现了迭代器模式。

二、迭代器模式的实现

public interface Iterator {
    String next();
    boolean hasNext();
}

抽象的迭代器角色。

public class MyIterator implements Iterator {
    private List<String> list;

    private Integer index;

    public MyIterator(List<String> list) {
        this.list = list;
        this.index = -1;
    }

    @Override
    public String next() {
        if (hasNext()){
            return list.get(++index);
        }
        return null;
    }

    @Override
    public boolean hasNext() {
        return index < list.size() - 1;
    }
}

具体迭代器角色,实现了抽象迭代器定义的hasNext方法和next方法。

public interface AbstractStringCollect {
    void add(String s);

    void remove(String s);

    Iterator getIterator();
}

抽象聚合角色,有增加元素和删除元素的方法,以及获取迭代器方法。

public class StringCollect implements AbstractStringCollect {
    private List<String> list = new ArrayList<>();

    @Override
    public void add(String s) {
        list.add(s);
    }

    @Override
    public void remove(String s) {
        list.remove(s);
    }

    @Override
    public Iterator getIterator() {
        return new MyIterator(list);
    }
}

具体聚合元素,实现了抽象聚合角色的方法。

public class IteratorTest {
    public static void main(String[] args) {
        StringCollect collect = new StringCollect();
        collect.add("张三");
        collect.add("李四");
        collect.add("王五");
        Iterator iterator = collect.getIterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

顺序遍历添加到聚合里面的元素。 image.png

三、总结

如果我们把遍历集合的方法封装在类内部,到了我们需要修改遍历方法的时候,我们就需要修改原来的代码,违背了开闭原则,所以我们提供了迭代器来实现元素的访问。迭代器模式的缺点是增加迭代器会增加几个类,一定程度上增加了系统的复杂性。

迭代器模式的角色:

  1. 抽象聚合角色:定义存储,添加,删除聚合对象以及获取迭代器对象的接口。
  2. 具体聚合角色:实现抽象聚合,返回一个具体的迭代器。
  3. 抽象迭代器:定义访问和遍历聚集元素的接口,通常包括hasNext和next。
  4. 具体迭代器:抽象迭代器的实现。