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

Iterator(迭代器)設計模式

宣告:本博文篇幅短,適合review。

一、概念

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

二、模式結構圖

三、例子

template<class Item>
class Iterator
{
public:
    virtual void first()=0;
    virtual void next()=0;
    virtual Item* currentItem()=0;
    virtual bool isDone()=0;
    virtual ~Iterator(){}
};

template<class Item>
class ConcreteIterator : public Iterator <Item>
{
private:
    ConcreteAggregate<Item> * aggr;
    int cur;
public:
    ConcreteIterator(ConcreteAggregate<Item>* a):aggr(a),cur(0){}
    void first()
    {
        cur = 0;
    }
    void next()
    {
        if(cur < aggr->getSize())
            cur++;
    }
    Item currentItem()
    {
        if(cur < aggr->getSize())
            return (*aggr)[cur];
        else
            return NULL;
    }
    bool isDone()
    {
        return (cur >= aggr->getSize());
    }
};

template<class Item>
class Aggregate
{
public:
    virtual Iterator<Item>* createIterator()=0;
    virtual ~Aggregate(){}
};

template<class Item>
class ConcreteAggregate : public Aggregate<Item>
{
private:
    vector<Item> data;
public:
    ConcreteAggregate()
    {
        data.push_back(1);
        data.push_back(2);
        data.push_back(3);
    }
    Iterator<Item>* createIterator()
    {
        return new ConcreteIterator<Item>(this);
    }
    Item& operator[](int index)
    {
        return data[index];
    }
    int getSize()
    {
        return data.size();
    }
};

void main()
{
    Aggregate<int> * aggr = new ConcreteAggregate<int>();
    Iterator<int> * it = aggr->createIterator();

    for(it->first(); !it->isDone(); it->next())
    {
        cout<<it->currentItem()<<endl;
    }
    delete it;
    delete aggr;
}

四、優缺點

       1、優點

             a、隱藏容器的實現細節。

             b、可以為容器或其子容器實現不同的迭代方法或多個迭代方法。

             c、支援多型迭代

       2、缺點

             a、遍歷時不可以刪除或者增加資料物件。