展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

迭代器模式在JDK应用

  • JDK的ArrayList 集合中就使用了迭代器模式
public class IteratorPattern {
    @SuppressWarnings("rawtypes")
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<String> a = new ArrayList<>();
        a.add("jack");//..
        Iterator Itr = a.iterator();
        while (Itr.hasNext()) {
            System.out.println(Itr.next());
        }
    }
}

public interface Iterator<E> {
    boolean hasNext();
    E next();
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
}

//ArrayList 聚合实现类,实现了聚合接口List
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
    private class Itr implements Iterator<E> { //内部类Itr 实现了Iterator 接口,是具体的接口实现类。
        //省略
        public boolean hasNext() {
            return cursor != size;
        }
        @SuppressWarnings("unchecked")
        public E next() {}//省略 }
        public Iterator<E> iterator() { 
            return new Itr(); 
        } // 聚合实现类,得到一个迭代器}

public interface List<E> extends Collection<E> {
    Iterator<E> iterator(); //聚合接口,返回迭代器
}
  • 角色职责说明
内部类Itr 充当具体实现迭代器Iterator 的类, 作为ArrayList 内部类
List 就是充当了聚合接口,含有一个iterator() 方法,返回一个迭代器对象
ArrayList 是实现聚合接口List 的子类,实现了iterator()
Iterator 接口系统提供
迭代器模式解决了 不同集合(ArrayList ,LinkedList) 统一遍历问题
  • 迭代器模式的注意事项和细节
优点
1) 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。
2) 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
3) 提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开
这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。
4) 当要展示一组相似对象,或者遍历一组相同对象时使用, 适合使用迭代器模式

缺点
每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类
posted @ 2022-09-01 07:55  DogLeftover  阅读(14)  评论(0编辑  收藏  举报