- 定义迭代器的接口,以及对应的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;}@Overridepublic int size() {return size;}@Overridepublic MyIterator myiterator() {return new ArrayListIterator<E>();}class ArrayListIterator<E> implements MyIterator<E> {private int index = 0;@Overridepublic boolean hasNext() {return index < size;}@Overridepublic 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());}}
}