模式用途:設計能裝載任意對象的容器,並要求該容器有一個遍歷元素的iterator()方法,用來遍歷容器中的每個元素。
設計一個容器的接口,用來定義這些”能裝載任意對象的容器”的方法,從而在使用這些容器的時候可以更加靈活,更換起來只需要更改裝載的容器的類型即可,其他方法都不用改變。
Ø 接口Collection.java
package com.yilong.designpattern.iterator;
public interface Collection {
public void add(Object obj);
public int size();
public Iterator iterator();
}
Ø 實現了Collection接口的ArrayList.java
package com.yilong.designpattern.iterator;
public class ArrayList implements Collection {
Object[] objs = new Object[10];
int index = 0;
public void add(Object obj) {
if(index == objs.length) {
Object[] newObjs = new Object[objs.length * 2];
System.arraycopy(objs, 0, newObjs, 0, objs.length);
objs = newObjs;
}
objs[index] = obj;
index ++;
}
public Iterator iterator() {
return new ArrayIterator(this);
}
public int size() {
return index;
}
public Object get(int i) {
return objs[i];
}
}
說明:System.arraycopy(objs, 0, newObjs, 0, objs.length);表示把objs數組中索引爲0-objs.length的元素複製到數組newObjs中,第一個0表示從newObjs的0位置開始複製。
容器的iterator()方法會調用適合本身容器進行遍歷的迭代器Iterator。
還需要注意的一點是get(int i)方法不要放在Collection接口的方法定義中,因爲Collection接口已經有iterator()方法足以遍歷容器中元素了, 可見get(int i)方法並不是每種容器都必須的,因此更加適合於只定義在具體的容器中。
Ø 迭代器接口Iterator.java
package com.yilong.designpattern.iterator;
public interface Iterator {
public boolean hasNext();
public Object next();
}
說明:該接口主要有兩個方法,一個是判斷容器中是否還有下一個元素的hasNext(),另一個是取出容器中下一個元素next()方法。
Ø 實現了Iterator接口的ArrayIterator.java
package com.yilong.designpattern.iterator;
public class ArrayIterator implements Iterator{
private ArrayList arrayList;
private int index = 0;
ArrayIterator(ArrayList arrayList) {
this.arrayList = arrayList;
}
public boolean hasNext() {
if(this.index < this.arrayList.size()) {
return true;
} else {
return false;
}
}
public Object next() {
Object obj = arrayList.get(this.index);
this.index ++;
return obj;
}
}
說明:主要用以對ArrayList容器進行遍歷的iterator類。
Ø Book.java
package com.yilong.designpattern.iterator;
public class Book {
private String bookName;
public Book(String bookName) {
this.bookName = bookName;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
Ø Main.java
package com.yilong.designpattern.iterator;
public class Main {
public static void main(String[] args) {
Collection objList = new ArrayList();
objList.add(new Book("《名偵探柯南》"));
objList.add(new Book("《遊戲王》"));
objList.add(new Book("《三國演義》"));
Iterator iterator = objList.iterator();
while(iterator.hasNext()) {
Book book = (Book)iterator.next();
System.out.println(book.getBookName());
}
}
}
該設計模式的UML圖如下:
說明:JDK的Iterator與上述的設計原理完全一樣,因此測試的代碼可以直接copy上述的代碼,只需要引入具體的包即可。
Ø Main.java
package com.yilong.test.jdk.iterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class TestIterator {
public static void main(String[] args) {
Collection bookShelfs = new ArrayList();
bookShelfs.add(new Book("福爾摩斯"));
bookShelfs.add(new Book("名偵探柯南"));
bookShelfs.add(new Book("遊戲王"));
System.out.println(bookShelfs.size());
Iterator bookShelfIterator = bookShelfs.iterator();
while(bookShelfIterator.hasNext()) {
Book book = (Book)bookShelfIterator.next();
System.out.println(book.getName());
}
ArrayList arrayList = new ArrayList();
System.out.println(arrayList.get(0));
}
}