感受太複雜了,看起來頭疼,本身看源碼畫了一個和迭代器有關的類圖(以ArrayList爲例,java8):java
package designpattern.iterator; import java.util.Iterator; public interface MyList<E> extends Iterable<E> {// 爲了客戶端直接經過接口使用foreach方法 void set(E e, int index); E get(int index); void remove(int index);// 數組實現,有點麻煩,就不寫了 void changeIterator(Iterator iterator); int getSize(); }
package designpattern.iterator; import java.util.Iterator; public class MyArrayList<E> implements MyList<E>, Iterable<E> { E[] data; private int size; Iterator<E> iterator; public MyArrayList(E[] data) { super(); this.data = data; size = data.length; iterator = new MyInteratorAsc<>(this);// 默認使用正序迭代器 } @Override public void set(E e, int index) { if (index < size) { data[index] = e; } else { System.out.println(index + "大於數組大小"); } } @Override public E get(int index) { return data[index]; } @Override public Iterator<E> iterator() { return iterator; } @Override public void remove(int index) { throw new UnsupportedOperationException("暫未實現"); } @Override public int getSize() { return size; } @Override public void changeIterator(Iterator iterator) { this.iterator = iterator; } }
package designpattern.iterator; import java.util.Iterator; public class MyInteratorAsc<E> implements Iterator<E> { MyList<E> myList; public MyInteratorAsc(MyList<E> myList) { super(); this.myList = myList; this.current = 0; } int current; @Override public boolean hasNext() { if (current < myList.getSize()) { return true; } else { return false; } } @Override public E next() { return myList.get(current++); } }
package designpattern.iterator; import java.util.Iterator; public class MyInteratorDesc<E> implements Iterator<E> { MyList<E> myList; public MyInteratorDesc(MyList<E> myList) { super(); this.myList = myList; this.current = myList.getSize() - 1; } int current; @Override public boolean hasNext() { if (current >= 0) { return true; } else { return false; } } @Override public E next() { return myList.get(current--); } }
package designpattern.iterator; public class Client { public static void main(String[] args) { MyList<String> myList = new MyArrayList<>(new String[4]); myList.set("鼠", 0); myList.set("牛", 1); myList.set("虎", 2); myList.set("兔", 3); myList.set("龍", 4); for (String string : myList) { System.out.println(string); } System.out.println("-------換成倒序-------"); myList.changeIterator(new MyInteratorDesc<>(myList)); for (String string : myList) { System.out.println(string); } } }
4大於數組大小 鼠 牛 虎 兔 -------換成倒序------- 兔 虎 牛 鼠