[C++設計模式] iterator 迭代器模式

來源:互聯網
上載者:User

標籤:c++   設計模式   迭代器模式   

迭代器模式定義:提供一種方法順序訪問一個彙總對象中各個元素,而又不需要暴露該對象。

迭代器分內部迭代器和外部迭代器,內部迭代器與對象耦合緊密,不推薦使用。外部迭代器與彙總容器的內部對象松耦合,推薦使用。
迭代器模式就是分離了集合對象的遍曆行為,抽象出一個迭代器類來負責,這樣既可以做到不暴露集合的內部結構,又可讓外部代碼透明地訪問集 合內部的資料。而且,可以同時
定義多個迭代器來遍曆,互不衝突。

對於迭代器,參考STL迭代器,只需要使用具體容器的迭代器就可以遍曆該容器內的彙總對象,也可以藉助迭代器實現對象的諸如添加、刪除和調用。


1.迭代器角色(Iterator):迭代器角色負責定義訪問和遍曆元素的介面。
2.具體迭代器角色(Concrete Iterator):具體迭代器角色要實現迭代器介面,並要記錄遍曆中的當前位置。
3.集合角色(Aggregate):集合角色負責提供建立具體迭代器角色的介面。
4.具體集合角色(Concrete Aggregate):具體集合角色實現建立具體迭代器角色的介面——這個具體迭代器角色於該集合的結構相關。

C++迭代器模式(與STL介面保持一致)代碼:

#include <iostream>#include <vector>using namespace std;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 ConcreteAggregate;template<class Item>class ConcreteIterator : public Iterator <Item>{    ConcreteAggregate<Item> * aggr;    int cur;public:    ConcreteIterator(ConcreteAggregate<Item>*a):aggr(a),cur(0){}    virtual void first()    {        cur=0;    }    virtual void next()    {        if(cur<aggr->getLen())            cur++;    }    virtual Item* currentItem()    {        if(cur<aggr->getLen())            return &(*aggr)[cur];        else            return NULL;    }    virtual bool isDone()    {        return (cur>=aggr->getLen());    }};template<class Item>class Aggregate{public:    virtual Iterator<Item>* createIterator()=0;    virtual ~Aggregate(){}};template<class Item>class ConcreteAggregate:public Aggregate<Item>{    vector<Item >data;public:    ConcreteAggregate()    {        data.push_back(1);        data.push_back(2);        data.push_back(3);    }    virtual Iterator<Item>* createIterator()    {        return new ConcreteIterator<Item>(this);    }    Item& operator[](int index)    {        return data[index];    }    int getLen()    {        return data.size();    }};int 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;    return 0;}


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

[C++設計模式] iterator 迭代器模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.