1. 程式人生 > >淺談Java設計模式——迭代器模式(Iterator)

淺談Java設計模式——迭代器模式(Iterator)

一、概述

        給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。

二、使用場景

1.訪問一個聚合物件的內容而無需暴露它的內部表示。 

2.支援對聚合物件的多種遍歷。 

3.為遍歷不同的聚合結構提供一個統一的介面(即,支援多型迭代)。

三、參與者

1.Iterator 迭代器定義訪問和遍歷元素的介面。 

2.ConcreteIterator 具體迭代器實現迭代器介面。 對該聚合遍歷時跟蹤當前位置。 

3.Aggregate 聚合定義建立相應迭代器物件的介面。

4.ConcreteAggregate 具體聚合實現建立相應迭代器的介面,該操作返回ConcreteIterator的一個適當的例項.

四、類圖

五、程式碼示例

1.Iterator

/**
 * Iterator
 * @author zhipeng_Tong
 */
public interface Iterator {
    Object next();
    Object first();
    Object last();
    boolean hasNext();
}

2.ConcreteIterator

/**
 * ConcreteIterator
 * @author zhipeng_Tong
 */
public class IteratorImpl implements Iterator {
    private List list;
    private int index;

    public IteratorImpl(List list) {
        this.list = list;
    }

    @Override
    public Object next() {
        index++;
        return list.get(index - 1);
    }

    @Override
    public Object first() {
        return list.get(0);
    }

    @Override
    public Object last() {
        return list.get(list.size() - 1);
    }

    @Override
    public boolean hasNext() {
        return index < list.size();
    }
}

3.Aggregate

/**
 * Aggregate
 * @author zhipeng_Tong
 */
public interface List {
    Iterator iterator();

    Object get(int index);

    int size();

    void add(Object o);
}

4.ConcreteAggregate

/**
 * ConcreteAggregate
 * @author zhipeng_Tong
 */
public class ListImpl implements List {
    private Object[] list;
    private int index;
    private int size;

    public ListImpl() {
        this.list = new Object[100];
        this.index = 0;
        this.size = 0;
    }

    @Override
    public Iterator iterator() {
        return new IteratorImpl(this);
    }

    @Override
    public Object get(int index) {
        return list[index];
    }

    @Override
    public int size() {
        return this.size;
    }

    @Override
    public void add(Object o) {
        list[index++] = o;
        size++;
    }
}

5.測試程式碼

public class Client {
    public static void main(String[] args) {
        List list = new ListImpl();
        list.add("hello");
        list.add("word");
        list.add("java");

        Iterator iterator = list.iterator();
        while (iterator.hasNext())
            System.out.println(iterator.next());

        System.out.println("first: " + iterator.first());
        System.out.println("last: " + iterator.last());

        System.out.println();

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

執行結果

hello
word
java
first: hello
last: java

hello
word
java