大话设计模式C++实现-第20章-迭代器模式
来源:互联网 发布:js hidden input 赋值 编辑:程序博客网 时间:2024/06/06 01:37
一、UML图
二、概念
迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
三、说明
什么时候用?
(1)当你需要访问一个聚集对象,而且不管这些对象时什么都需要遍历的时候,你就应该考虑用迭代器模式。
(2)你需要对聚集有多种遍历时,可以考虑用迭代器模式。
(3)为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。
迭代器模式的好处?
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
四、C++实现
(1)Iterator.h
#ifndef ITERATOR_H#define ITERATOR_H#include <vector>#include <iostream>#include "Aggregate.h"typedef std::string object;//迭代器抽象类class Iterator{public:virtual object First()=0;virtual object Next()=0;virtual bool IsDone()=0;virtual object CurrentItem()=0;};//具体迭代器类,从前往后的迭代器class ConcreteIterator:public Iterator{private:ConcreteAggregate* aggregate;int current;public:ConcreteIterator(Aggregate* aggregate);object First();object Next();bool IsDone();object CurrentItem();};//具体迭代器类,从后往前的迭代器class ConcreteIteratorDesc:public Iterator{private:ConcreteAggregate* aggregate;int current;public:ConcreteIteratorDesc(Aggregate* aggregate);object First();object Next();bool IsDone();object CurrentItem();};#endif
(2)Iterator.cpp
#include "Iterator.h"ConcreteIterator::ConcreteIterator(Aggregate* aggregate){this->aggregate=(ConcreteAggregate*)aggregate;current=0;}object ConcreteIterator::First(){return aggregate->GetVector()->at(0);}object ConcreteIterator::Next(){current++;if(current<aggregate->GetVector()->size())return aggregate->GetVector()->at(current);}bool ConcreteIterator::IsDone(){return current>=aggregate->GetVector()->size()?true:false;}object ConcreteIterator::CurrentItem(){return aggregate->GetVector()->at(current);}ConcreteIteratorDesc::ConcreteIteratorDesc(Aggregate* aggregate){this->aggregate=(ConcreteAggregate*)aggregate;current=(((ConcreteAggregate*)aggregate)->GetVector()->size())-1;}object ConcreteIteratorDesc::First(){return *(aggregate->GetVector()->end());}object ConcreteIteratorDesc::Next(){current--;if(current>=0)return aggregate->GetVector()->at(current);}bool ConcreteIteratorDesc::IsDone(){return current<0?true:false;}object ConcreteIteratorDesc::CurrentItem(){return aggregate->GetVector()->at(current);}
(3)Aggregate.h
#ifndef AGGREGATE_H#define AGGREGATE_H#include <vector>#include <string>#include <iostream>class Iterator;class ConcreteIterator;typedef std::string object;//聚集抽象类class Aggregate{public:virtual Iterator* CreateIterator()=0; virtual std::vector<object>* GetVector()=0;};//具体聚集类class ConcreteAggregate:public Aggregate{private:std::vector<object> *items;public:ConcreteAggregate();~ConcreteAggregate();//产生从前往后的迭代器Iterator* CreateIterator();//产生从后往前的迭代器Iterator* CreateIteratorDesc();std::vector<object>* GetVector();int Count();object GetElement(int index);void SetElement(int index,object o);};#endif
(4)Aggregate.cpp
#include "Aggregate.h"#include "Iterator.h"ConcreteAggregate::ConcreteAggregate(){items=new std::vector<object>;}ConcreteAggregate::~ConcreteAggregate(){delete items;}Iterator* ConcreteAggregate::CreateIterator(){Iterator* it=new ConcreteIterator(this);return it;}Iterator* ConcreteAggregate::CreateIteratorDesc(){Iterator* it=new ConcreteIteratorDesc(this);return it;}int ConcreteAggregate::Count(){return items->size();}std::vector<object>* ConcreteAggregate::GetVector(){return items;}object ConcreteAggregate::GetElement(int index){return items->at(index);}void ConcreteAggregate::SetElement(int index,object o){items->at(index)=o;}
(5)Client.cpp
#include "Iterator.h"#include "Aggregate.h"#include <iostream>#include <cstdlib>//Client客户端void main(){//公交车,即聚集对象ConcreteAggregate* a=new ConcreteAggregate();//新上来的乘客a->GetVector()->push_back("大鸟");a->GetVector()->push_back("小菜");a->GetVector()->push_back("行李");a->GetVector()->push_back("老外");a->GetVector()->push_back("公交内部人员");a->GetVector()->push_back("小偷");//售票员出场,先看好了上车的是哪些人,即声明了迭代器对象。//下面两种获取迭代器的方法都可以//Iterator* i=new ConcreteIterator(a);//产生从前往后的迭代器Iterator* it1=a->CreateIterator();//告知每一位乘客买票std::cout<<"从前往后的迭代器:"<<std::endl<<std::endl;while(!it1->IsDone()){std::cout<<it1->CurrentItem()<<" 请买车票!"<<std::endl;it1->Next();}std::cout<<std::endl;//产生从后往前的迭代器Iterator* it2=a->CreateIteratorDesc();//告知每一位乘客买票std::cout<<"从后往前的迭代器:"<<std::endl<<std::endl;while(!it2->IsDone()){std::cout<<it2->CurrentItem()<<" 请买车票!"<<std::endl;it2->Next();}std::cout<<std::endl<<std::endl;delete a,it1,it2;system("pause");}
(6)运行截图
0 0
- 大话设计模式C++实现-第20章-迭代器模式
- 大话设计模式C++实现-第16章-状态模式
- 大话设计模式C++实现-第2章-策略模式
- 大话设计模式C++实现-第6章-装饰模式
- 大话设计模式C++实现-第7章-代理模式
- 大话设计模式C++实现-第9章-原型模式
- 大话设计模式C++实现-第12章-外观模式
- 大话设计模式C++实现-第14章-观察者模式
- 大话设计模式C++实现-第17章-适配器模式
- 大话设计模式C++实现-第18章-备忘录模式
- 大话设计模式C++实现-第19章-组合模式
- 大话设计模式C++实现-第23章-命令模式
- 大话设计模式C++实现-第28章-访问者模式
- 大话设计模式C++实现-第7章-代理模式
- 大话设计模式--第20章 想走?可以!先买票--迭代器模式
- 大话设计模式20----迭代器模式
- 大话设计模式C++实现-第1章-简单工厂模式
- 大话设计模式C++实现-第8章-工厂方法模式
- 吝啬的国度 nyoj
- HDU1708 Fibonacci String【水题】
- C# 调用C++ DLL 总结
- Linux 下安装Eclipse
- 0PE专用菜单文件MENU.0PE解读(二) 批处理篇
- 大话设计模式C++实现-第20章-迭代器模式
- HDU1718 Rank【水题】
- HDU_1010 Tempter of the Bone[DFS]
- Java EE HTML5 WebSocket 示例【转自http://www.oschina.net/translate/java-ee-html5-websocket-example】
- 判断一个字符串是否是由字母组成
- 算法导论学习笔记(3)-习题2.3-7-排序+二分
- 架构与反射——Struts2开发过程与处理流程解析
- CentOS-6.3安装Mysql-5.5.29
- 【剑指Offer面试编程题】题目1372:最大子向量和--九度OJ