1. 程式人生 > >研磨設計模式之迭代器

研磨設計模式之迭代器

聚合

指一組物件的組合結構,如Java中的集合、陣列等

迭代器模式

提供一種方法,順序訪問一個聚合物件中的各個元素,而又不需要暴露該物件的內部表示

目標

以一個統一的方式來訪問內部實現不同的聚合物件

示例程式碼

  • 迭代器介面
/**
 * 迭代器介面,定義訪問和遍歷元素的操作
 *
 */
public interface Iterator {

    /**
     * 移動到聚合物件的第一個位置
     */
    public void first();
    /**
     * 移動到聚合物件的下一個位置
     */
public void next(); /** * 判斷是否已經移動到聚合物件的最後一個位置 * @return true表示已經移動到聚合物件的最後一個位置 * false 表示還沒有移動到聚合物件的最後一個位置 */ public boolean isDone(); /** * 獲取迭代的當前元素 * @return 迭代的當前元素 */ public Object currentItem(); }
  • 聚合物件的介面
/**
 * 聚合物件的介面,定義建立相應迭代器物件介面
 *
 */
public abstract class Aggregate { /** * 工廠方法,建立相應迭代器物件的介面 * @return 相應迭代器物件的介面 */ public abstract Iterator createIterator(); }
  • 迭代器實現物件

/**
 * 具體的迭代器實現物件,示意的是聚合物件為陣列的迭代器
 * 不同的聚合物件,相應的迭代器實現是不一樣的
 */
public class ConcreteIterator implements Iterator{
    /**
     * 持有被迭代的具體的聚合物件
     */
private ConcreteAggregate aggregate; /** * 內部索引,記錄當前被迭代到的索引位置 * -1 表示剛開始的時候,迭代器指向聚合物件第一個元素之前 */ private int index = -1; /** * 構造方法,傳入被迭代的具體的聚合物件 * @param aggregate 被迭代的具體的聚合物件 */ public ConcreteIterator(ConcreteAggregate aggregate) { this.aggregate = aggregate; } @Override public void first() { index = 0; } @Override public void next() { if(index < this.aggregate.size()) { index = index + 1; } } @Override public boolean isDone() { if(index == this.aggregate.size()) { return true; } return false; } @Override public Object currentItem() { return this.aggregate.get(index); } }
  • 具體的聚合物件
/**
 * 具體的聚合物件,實現建立相應迭代器物件的功能
 *
 */
public class ConcreteAggregate extends Aggregate{
    /**
     * 聚合物件的具體內容
     */
    private String[] array = null;

    /**
     * 構造方法,傳入聚合物件具體的內容
     * @param array 聚合物件具體的內容
     */
    public ConcreteAggregate(String[] array) {
        this.array = array;
    }

    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(this);
    }
    /**
     * 獲取索引相對應的元素
     * @param index 索引
     * @return 索引相對應的元素
     */
    public Object get(int index) {
        Object ret = null;
        if(index<array.length) {
            ret = array[index];
        }
        return ret;
    }
    /**
     * 獲取聚合物件的大小
     * @return 聚合物件的大小
     */
    public int size() {
        return this.array.length;
    }

}
  • 使用示例
String[] names = {"張三","李四","王五","趙六"};
//建立聚合物件
Aggregate aggregate = new ConcreteAggregate(names);
//迴圈輸出聚合物件中的值
Iterator it = aggregate.createIterator();
//首先設定迭代器到第一個元素
it.first();
while(!it.isDone()) {
    Object obj = it.currentItem();
    System.out.println(obj);
    it.next();
}