C++设计模式之迭代器模式(Iterator)
迭代器在STL运用广泛,类似容器的迭代已经成为其重要特性,而迭代器模式则是利用迭代器概念进行的抽象运用,迭代器模式运用广泛和有用,因为其能够不考虑数据的存储方式,而是直接面对数据进行迭代,也就是说我们不用考虑集合是数组(或vector)、链表、栈还是队列,而是通过统一的接口进行顺序的访问。
作用
迭代器模式提供了一种顺序访问容器中元素的方法,而无需了解器内部的类型和结构,该模式的核心思想将访问和遍历容器对象的功能交给一个外部的迭代器对象,该迭代器定义了访问聚合对象的接口,
类视图
实现
class Item { public: Item(string strName,float price): m_name(strName),m_price(price){} Item(Item& item): m_name(item.strName),m_price(item.price){} string tostring() { std::ostringstream buffer; buffer << f; string strPrice = buffer.str(); strName += " :"; return strName + strPrice; } private: string m_name; float m_price; } class Container; class Menu; class Iterator { public: virtual ~Iterator(){} virtual void first()=0; virtual void next()=0; virtual bool hasnext()=0; virtual Item* current()=0; protected: Container * m_pContainer; } class Container { public: virtual ~Container() {}; virtual void CreateIterator()= 0; protected: Observer(){}; }; class MenuIterator : public Iterator { Menu * m_menu; int curpos; public: MenuIterator(Menu*a):m_menu(a),curpos(0){} virtual void first() { curpos=0; } virtual void next() { curpos++; } virtual bool hasnext() { if(curpos >=0 && curpos< m_menu->size()) } virtual Item* current() { return m_menu->value(curpos); } }; class Menu : public Container { public: virtual ~Menu() { for(int i=0 ; i< m_items.size(); i++) { delete m_items[i]; } }; Iterator* CreateIterator() { return new MenuIterator(this); } int size() { return m_items.size(); } Item* value(int nIndex) { if(nIndex>=0 && nIndex<m_items.size()) { return m_items[nIndex]; } else { return NULL; } } void additem(Item& item) { Item *pItem = new Item(item); m_items.push_back(pItem); } private: vector<item* > m_items; }; int main() { Item it1("chicken", 10.0); Item it2("Apple", 5.0); Item it3("Beaf", 20.0); Item it4("soup",15.0); Menu menu; menu.additem(it1); menu.additem(it2); menu.additem(it3); menu.additem(it4); Iterator itor = menu.CreateIterator(); while(itor->hasnext()) { Item* pItem = itor->current(); if(pItem) cout<<pItem->tostring()<<endl; itor->next(); } }
对于上例来说,Iterator接口是不变的,不管menu中的聚合内容的形式如何变化,只要menu根据其类型提供其取值、大小等的操作,那么对于使用者来说都是一样的操作。
应用场景
- 访问一个聚合对象的内容而无需暴露它的内部表示;
- 支持对聚合对象的多种遍历(从前到后,从后到前);
- 为遍历不同的聚合结构提供一个统一的接口,支持多态迭代。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10深入理解C++中常见的关键字含义
- 01-10使用C++实现全排列算法的方法详解
- 01-10APUE笔记之:进程环境详解
- 01-10c++中inline的用法分析
- 01-10用C++实现DBSCAN聚类算法
- 01-10全排列算法的非递归实现与递归实现的方法(C++)
- 01-10C++大数模板(推荐)
- 01-10浅谈C/C++中的static与extern关键字的使用详解
- 01-10深入C/C++浮点数在内存中的存储方式详解
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10C#中split用法实例总结
- 04-02jquery与jsp,用jquery
- 01-11ajax实现页面的局部加载
- 01-10delphi制作wav文件的方法
- 01-10SublimeText编译C开发环境设置
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05织梦dedecms什么时候用栏目交叉功能?