首页 > 代码库 > 【设计模式】——迭代器模式
【设计模式】——迭代器模式
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,或者你需要对聚集有多种方式遍历时,你就应该考虑用迭代器模式,为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一接口。
#include <iostream>#include <vector>using namespace std;typedef string object;//Iterator迭代器抽象类class Iterator{ //用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法public: virtual object First()=0; virtual object Next()=0; virtual bool IsDone()=0; virtual object CurrentItem()=0;};//Aggregate聚集抽象类class Aggregate{public: virtual int Count() = 0; virtual void Push(const object& strValue)=0; virtual object Pop(const int nIndex)=0; virtual Iterator *CreateIterator()=0;};//ConcreteIterator具体迭代器类,继承Iteratorclass ConcreteIterator:public Iterator{private: //定义一个具体聚集对象 Aggregate *m_aggregate; int m_current=0;public: ConcreteIterator(Aggregate *aggregate) { this->m_aggregate=aggregate; } object First() { return m_aggregate->Pop(0); } object Next() { object strRet; m_current++; if(m_current<m_aggregate->Count()) { strRet=m_aggregate->Pop(m_current); } return strRet; } bool IsDone() { return ((m_current>=m_aggregate->Count())?true:false); } object CurrentItem() { return m_aggregate->Pop(m_current); }};//ConcreteAggregate具体聚集类,继承Aggregateclass ConcreteAggregate:public Aggregate{private: //声明一个list泛型变量,用于存放聚合对象 vector<object> items; Iterator *m_pIterator;public: ConcreteAggregate():m_pIterator(NULL) { items.clear(); } ~ConcreteAggregate() { if(m_pIterator!=NULL) { delete m_pIterator; m_pIterator==NULL; } } Iterator* CreateIterator() { if(NULL == m_pIterator) { m_pIterator = new ConcreteIterator(this); } return m_pIterator; } int Count() { return items.size(); } void Push(const object& strValue) { items.push_back(strValue); } string Pop(const int nIndex) { object strRet; if(nIndex<Count()) { strRet=items[nIndex]; } return strRet; }};int main(){ ConcreteAggregate *a=new ConcreteAggregate(); a->Push("大鸟"); a->Push("小菜"); a->Push("行李"); a->Push("老外"); a->Push("公交内部员工"); a->Push("小偷"); Iterator *i=a->CreateIterator(); object item=i->First(); while(!i->IsDone()) { cout << i->CurrentItem() << "请买票" << endl; i->Next(); } return 0;}
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。迭代器模式在访问数组、集合、列表等数据时,尤其是数据库数据操作时,是非常普遍的应用,但由于它太普通了,所以各种操作语言都对他进行了封装。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。