设计模式---迭代器模式(C++实现)
来源:互联网 发布:淘宝秒杀催生团队 编辑:程序博客网 时间:2024/06/05 13:26
迭代器模式(Iterator Pattern)用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
意图
提供一种方法顺序访问一个聚合 对象中各个元素,而又无需暴露该对象的内部表示。
解决问题
不同的方式遍历整个对象
如何解决
把元素之间游走的责任交给迭代器,而不是聚合对象。
优点
缺点1. 支持不同的 方式遍历聚合对象
2. 迭代器模式简化了聚合类
3. 在同一个聚合上可以有多个遍历
4. 在迭代器模式中,增加新的聚合类和迭代器都很方便,无需修改原有代码。
由于迭代器模式将存储数据和遍历数据分隔,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂程度。
使用场景
1. 访问一个聚合对象的内容而无需暴露它的内部表示;
2. 需要为聚合对象提供多种遍历方式
3. 为遍历不同的聚合结构提供一个统一的接口
注意事项
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部数据。
C++实现
举例子: 在现在的电视机中,我们使用[后一个]和[前一个]按钮可以很方便的换台,当按下[后一个]按钮时,将切换到下一个预置的频道。想象一下在陌生的城市中的旅店中看电视。当改变频道时,重要的不是几频道,而是节目内容。如果对一个频道的节目不感兴趣,那么可以换下一个频道,而不需要知道它是几频道。
UML类图
code:
//迭代器模式/*1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。2.具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。3.集合角色(Aggregate):集合角色负责提供创建具体迭代器角色的接口。4.具体集合角色(Concrete Aggregate):具体集合角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该集合的结构相关。*/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 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();}};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];//aggr是指针所以需要先解引用再[],最后返回元素地址elsereturn NULL;}virtual bool isDone(){return (cur >= aggr->GetLen());}};
客户端:
int test_Iterator() //迭代器模式{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;system("pause");return 0;}
学习建议: 看看STL里面的迭代器实现吧 ,很经典
0 0
- 设计模式--单例模式 C++实现
- 设计模式 行为模式 命令模式 c语言 版本实现
- 设计模式_迭代器模式(C++)
- 设计模式C++实现十六:迭代器模式
- scala实现设计模式之迭代器模式
- 设计模式--迭代器模式(C++实现)
- 设计模式---迭代器模式(C++实现)
- 设计模式-迭代器模式 C++实现
- C语言实现状态设计模式
- Objective-c 实现单例设计模式
- C语言实现状态设计模式
- C语言设计模式:迭代器
- 设计模式的实现(C++)------工厂方法模式(FactoryMethod)
- 设计模式的实现(C++)------抽象工厂模式(AbstractFactory)
- 常见设计模式的解析和实现(C++)---Adapt模式
- 设计模式解析和实现(C++)之十五-Observer模式
- 设计模式解析与实现(C++)之Factory模式
- 设计模式的解析和实现(C++)之一-Factory模式
- thinkphp 自动完成在自动验证unique时失效的解决方法
- Spring中的JDBC操作
-  |"|&|<|>等html字符转义
- Android Https请求调用
- Mybatis环境配置
- 设计模式---迭代器模式(C++实现)
- Codeforces Round #401 (Div. 2) C Alyona and Spreadsheet —— 打表
- 从kubernetes看如何设计超大规模资源调度系统
- linux同时启动两个Tomcat
- python 入门级问题
- Myeclipse优化设置(编码、护眼、Maven、补全)
- Sublime Text 安装GIt 插件--SublimeGit
- ubuntu 中文搜狗输入发
- 欢迎使用CSDN-markdown编辑器