Java設計模式五:迭代器模式(Iterator)


迭代器模式有叫做游標(Cursor)模式。GOF給出的定義:提供一種方法訪問一個容器(container)對象中的各個元素,而又不暴露該對象的內部細節。

迭代器模式由以下角色組成:
迭代器角色(Iterator): 負責定義訪問和遍歷元素的接口。
具體迭代器角色(Concrete Iterator):實現迭代器接口,並要記錄遍歷中的當前位置。
容器角色(Container):  負責提供創建具體迭代器角色的接口。
具體容器角色(Concrete Container):實現創建具體迭代器角色的接口, 這個具體迭代器角色與該容器的結構相關。

類圖:

實例:
public interface Iterator
{
    public Object first();

    public Object next();

    public Object currentItem();

    public boolean isDone();
}

public class ConcreteIterator implements Iterator
{
    private int currentIndex = 0;
    private Vector vector = null;

    public ConcreteIterator(final Vector vector)
    {
        this.vector = vector;
    }

    @Override
    public Object first()
    {
        currentIndex = 0;
        return vector.get(currentIndex);
    }

    @Override
    public Object next()
    {
        currentIndex++;
        return vector.get(currentIndex);
    }

    @Override
    public Object currentItem()
    {
        return vector.get(currentIndex);
    }

    @Override
    public boolean isDone()
    {
        if (currentIndex >= this.vector.size() - 1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

public interface Aggregat
{
    public Iterator createIterator();
}

public class ConcreteAggregat implements Aggregat
{
    private Vector vector = null;

    public Vector getVector()
    {
        return vector;
    }

    public void setVector(final Vector vector)
    {
        this.vector = vector;
    }

    public ConcreteAggregat()
    {
        vector = new Vector();
        vector.add("vector 1");
        vector.add("vector 2");
    }

    @Override
    public Iterator createIterator()
    {
        return new ConcreteIterator(vector);
    }
}

public class Client
{
    public static void main(final String[] args)
    {
        final Aggregat agg = new ConcreteAggregat();
        final Iterator iterator = agg.createIterator();
        System.out.println(iterator.first());
        while (!iterator.isDone())
        {
            System.out.println(iterator.next());
        }
    }
}

結果:
vector 1
vector 2

 

JDK也提供了迭代接口進行java collection的遍歷:

Iterator it = list.iterator();   

while(it.hasNext()){   

//using it.next();

}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM