1. 程式人生 > >【迭代器模式】—— 資料的遍歷

【迭代器模式】—— 資料的遍歷

迭代器模式,提供了介面訪問容器中的元素,而不需要暴露容器的內部表現。

一、關鍵點

1)先看下這個模式點關鍵點:

遍歷:該模式的最大特點就是提供了遍歷內部集合資料的介面,從而達到訪問集合資料的目的;

解耦:該模式以迭代器的身份去實現遍歷集合物件的目的,從而不需要暴露內部的表示,達到了解耦的目的。

2)我們再看下它的類圖關係:

Iterator:迭代器介面;

ConcreteIterator:迭代器具體的實現介面,實現對集合資料的訪問;

Aggregate:容器集合的功能介面;

ConcreteAggregate:具體的容器類,通過相應的介面對外提供資料的訪問。

二、實現

2.1 Iterator 迭代器抽象介面

public interface Iterator<T> {

    boolean hasNext();

    T next();
}

2.2  ConcreteIterator 具體迭代器類

public class ConcreteIterator<T> implements Iterator<T> {
    private int mCursor;
    private List<T> mList = new ArrayList<>();

    public ConcreteIterator(List<T> list) {
        mList = list;
    }

    @Override
    public boolean hasNext() {
        return mCursor != mList.size();
    }

    @Override
    public T next() {
        T obj = null;
        if (hasNext()) {
            obj = mList.get(mCursor++);
        }
        return obj;
    }
}

2.3 Aggregate抽象容器介面 

public interface Aggregate<T> {

    void add(T obj);

    void remove(T obj);

    Iterator<T> iterator();
}

2.4 ConcreteAggregate具體的容器實現物件 

public class ConcreteAggregate<T> implements Aggregate<T> {
    private List<T> mList = new ArrayList<>();

    @Override
    public void add(T obj) {
        mList.add(obj);
    }

    @Override
    public void remove(T obj) {
        mList.remove(obj);
    }

    @Override
    public Iterator<T> iterator() {
        return new ConcreteIterator<>(mList);
    }
}

2.4 Client客戶端類 

public class Client {

    public static void main(String[] args) {
        Aggregate<String> containers = new ConcreteAggregate<>();
        containers.add("hello");
        containers.add("iterator");

        Iterator<String> iterator = containers.iterator();
        while (iterator.hasNext()) {
            /* print iterator iterator.next() */
        }
    }
}

三、小結 

3.1 訪問方式 該模式提供了種不需要知道內部表示的訪問方式,從而方便客戶端方便直接地訪問資料;

3.2 拓展與複用 該模式可以非常好地使用在一型別的集合物件上,並能根據需要拓展介面能力,靈活地變化。