迭代器模式Iterator

  • 定义迭代器的接口,以及对应的hasNext以及next方法
    • 注意定义的时候使用泛型,不然接口方法的返回值只能是Object,实际使用的时候还需要强制转换
  • 在被迭代的接口里面定义获取迭代器的方法
    • 注意使用泛型
  • 在需要被迭代的对象里面实现一个具体迭代器,专属于这个对象的迭代器以及对应的迭代方法,每一个对象的迭代遍历的方法应该是不一样
    • 注意实现被迭代接口的时候标注的泛型依旧是被迭代对象
    • public class MyArrayList<E> implements MyCollection<E>

实现(注意适应泛型)

定义迭代器的抽象方法

package com.deltaqin.designPattern.d06_iterator;

/**
 * @author deltaqin
 * @date 2021/3/27 10:38 上午
 */
public interface MyIterator<T> {
    boolean hasNext();

    T next();
}

定义集合的抽象方法

package com.deltaqin.designPattern.d06_iterator;

/**
 * @author deltaqin
 * @date 2021/3/27 10:39 上午
 */
public interface MyCollection<E> {
    void add(E e);
    int size();

    MyIterator myiterator();
}

在集合内部实现迭代器的具体逻辑

package com.deltaqin.designPattern.d06_iterator;

/**
 * @author deltaqin
 * @date 2021/3/27 10:40 上午
 */
public class MyArrayList<E> implements MyCollection<E>{
    private E[] objects = (E[])new Object[10];
    private int size = 0;
    
    public void add(E e) {
        if (size+1 < objects.length) {
            E[] objectTmp = (E[])new Object[objects.length * 2];
            System.arraycopy(objects,0,objectTmp,0,objects.length);
            objects = objectTmp;
        }
        
        objects[size++] = e;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public MyIterator myiterator() {
        return new ArrayListIterator<E>();
    }
    
    class ArrayListIterator<E> implements MyIterator<E> {

        private int index = 0;
        
        @Override
        public boolean hasNext() {
            return index < size;
        }

        @Override
        public E next() {
            E e = (E) objects[index++];
            return e;
        }
    }
}

测试

package com.deltaqin.designPattern.d06_iterator;

/**
 * @author deltaqin
 * @date 2021/3/27 10:33 上午
 */
public class Demo {
    public static void main(String[] args) {
        MyCollection<String> myCollection = new MyArrayList<>();

        myCollection.add("delta0");
        myCollection.add("delta1");
        myCollection.add("delta2");
        myCollection.add("delta3");

        MyIterator myiterator = myCollection.myiterator();
        while (myiterator.hasNext()) {
            System.out.println(myiterator.next());
        }
    }
}

posted on 2025-10-14 23:02  chuchengzhi  阅读(4)  评论(0)    收藏  举报

导航

杭州技术博主,专注分享云计算领域实战经验、技术教程与行业洞察, 打造聚焦云计算技术的垂直博客,助力开发者快速掌握云服务核心能力。

褚成志 云计算 技术博客