大话设计模式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