遍歷聚合物件中的元素——迭代器模式(四)

Liuwei-Sunny發表於2013-08-15

4 使用內部類實現迭代器

       在迭代器模式結構圖中,我們可以看到具體迭代器類和具體聚合類之間存在雙重關係,其中一個關係為關聯關係,在具體迭代器中需要維持一個對具體聚合物件的引用,該關聯關係的目的是訪問儲存在聚合物件中的資料,以便迭代器能夠對這些資料進行遍歷操作。

       除了使用關聯關係外,為了能夠讓迭代器可以訪問到聚合物件中的資料,我們還可以將迭代器類設計為聚合類的內部類JDK中的迭代器類就是通過這種方法來實現的,如下AbstractList類程式碼片段所示:

package java.util;
……
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    ......
    private class Itr implements Iterator<E> {
	    int cursor = 0;
        ......
}
……
}

       我們可以通過類似的方法來設計第3節中的ProductList類,將ProductIterator類作為ProductList類的內部類,程式碼如下所示:

//商品資料類:具體聚合類
class ProductList extends AbstractObjectList {
	public ProductList(List products) {
		super(products);
	}
	
	public AbstractIterator createIterator() {
		return new ProductIterator();
	}
	
	//商品迭代器:具體迭代器,內部類實現
	private class ProductIterator implements AbstractIterator {
		private int cursor1;
		private int cursor2;
		
		public ProductIterator() {
			cursor1 = 0;
			cursor2 = objects.size() -1;
		}
		
		public void next() {
			if(cursor1 < objects.size()) {
				cursor1++;
			}
		}
		
		public boolean isLast() {
			return (cursor1 == objects.size());
		}
		
		public void previous() {
			if(cursor2 > -1) {
				cursor2--;
			}
		}
		
		public boolean isFirst() {
			return (cursor2 == -1);
		}
		
		public Object getNextItem() {
			return objects.get(cursor1);
		} 
			
		public Object getPreviousItem() {
			return objects.get(cursor2);
		} 	
	}
}

       無論使用哪種實現機制,客戶端程式碼都是一樣的,也就是說客戶端無須關心具體迭代器物件的建立細節,只需通過呼叫工廠方法createIterator()即可得到一個可用的迭代器物件,這也是使用工廠方法模式的好處,通過工廠來封裝物件的建立過程,簡化了客戶端的呼叫。

 

【作者:劉偉   http://blog.csdn.net/lovelion

相關文章