1. 程式人生 > >設計模式(Java隨筆)—迭代器模式

設計模式(Java隨筆)—迭代器模式

迭代器模式(Iterator Pattern):最常被使用的幾個模式之一,被廣泛的應用到Java API中,如Java集合(Collection)框架中,就有用迭代器來遍歷集合中的元素(在Java開發中,儘量不要自己寫迭代器模,使用Java API提供的Iterator一般就能滿足專案要求)

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying respresentation.

提供一種方法訪問一個容器物件中各個元素,而又不需要暴露該物件的內部細節。

迭代器模式中的四個角色:

  • 抽象迭代器(Iterator)模式:定義訪問和遍歷元素的介面
  • 具體迭代器(Concrete Iterator)模式:實現抽象迭代器,完成容器元素的遍歷
  • 抽象聚集(Aggregate)角色:提供儲存元素,建立迭代器角色的介面
  • 具體聚集(Concrete Aggregate)角色:實現抽象聚集,儲存元素,建立迭代器物件

優點:封裝遍歷演算法,使演算法獨立於聚集角色,客戶無需知道聚集物件的型別,即使聚集物件的型別發生變化,也不會影響遍歷過程

迭代器模式程式碼實現(泛型):

import java.util.Vector;

public class IteratorModel {
	/*
	 * 迭代器模式
	 */
	public static void main(String[] args) {
		//建立聚集物件,並新增元素
		Aggregate<String> aggregate=new ConcreteAggregate<String>();
		aggregate.add("黯");
		aggregate.add("葉");
		aggregate.add("你");
		aggregate.add("好");
		aggregate.add("!");
		//建立迭代器物件,遍歷元素
		Iterator<String> iterator=aggregate.iterator();
		while(iterator.hasNext()){
			System.out.print(iterator.next());
		}
	}
}

//抽象迭代器介面
interface Iterator<E>{
	public E next();//返回下一個元素
	public boolean hasNext();//是否還有下一個元素
}

//具體迭代器
class ConcreteIterator<E> implements Iterator<E>{
	private Aggregate<E> aggregate=null;
	private int index;
	private int size;
	public ConcreteIterator(Aggregate<E> aggregate) {
		this.aggregate=aggregate;
		this.size=aggregate.size();
		this.index=0;
	}
	@Override
	public boolean hasNext() {
		return index<size;
	}

	@Override
	public E next() {
		return aggregate.get(index++);
	}
}

//抽象聚集介面(Aggregate)
interface Aggregate<E>{
	public void add(E e);//新增元素
	public Iterator<E> iterator();//建立迭代器物件
	public int size();//元素個數
	public E get(int index);//返回指定元素
}

//具體聚集
class ConcreteAggregate<E> implements Aggregate<E>{
	private Vector<E> vector=new Vector<E>();
	@Override
	public void add(E e) {
		vector.addElement(e);
	}

	@Override
	public Iterator<E> iterator() {
		return new ConcreteIterator<E>(this);
	}
	
	@Override
	public int size() {
		return vector.size();
	}

	@Override
	public E get(int index) {
		if(index<size()) {
			return vector.get(index);
		}
		return null;
	}
}

執行結果:

黯葉你好!

參考書籍:

《大話設計模式》——程傑

《設計模式(Java版)》

參考文件:JDK  API 1.6.0中文版