集約オブジェクト内の要素の遍歴-反復モード(4)


4内部クラスを使用した反復
反復モードの構造図では、特定の反復クラスと特定の集約クラスの間に二重の関係があることがわかります.1つの関係は関連関係であり、特定の反復では、集約オブジェクトに格納されたデータにアクセスするための特定の集約オブジェクトへの参照を維持する必要があります.反復器がこれらのデータを遍歴できるようにします.
関連関係の使用に加えて、反復器が集約オブジェクトのデータにアクセスできるように、反復器クラスを集約クラスの内部クラスとして設計することもできます.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】