迭代器在比较高级的语言如Java,C#,C++中都已经集成进语言中,所以平时使用的并不过。学习该设计模式主要是为了学习iterator的实现原理。
迭代器模式.h
#include <vector>
#include <string>
using namespace std;
class Object
{
public:
string name;
};
//迭代器类,Iterator
//用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法,统一接口
class Iterator
{
public:
virtual string First() = 0;
virtual string Next() = 0;
virtual bool IsEnd() = 0;
virtual string CurrentIterm() = 0;
};
//Aggregate 聚集抽象类
class Aggregate
{
public:
virtual Iterator *CreateIterator() = 0;
};
//具体集合类
class ConcreteAggregate : public Aggregate
{
public:
vector<string> iterms;
public:
Iterator *CreateIterator();
int Count()
{
return (int)iterms.size();
}
string get(int index)
{
return iterms[index];
}
};
//ConcreteIterator 具体迭代器类,继承Iterator
//不同的迭代器可以有不同迭代方式,比如从前向后,后者从后向前。需要的话可以自己在创建Iterator的子类
class ConcreteIterator : public Iterator
{
private:
ConcreteAggregate *aggregate; //定义了一个具体的聚集对象
int current;
public:
//初始化时将具体的聚集对象传入
ConcreteIterator(ConcreteAggregate *aggregate)
{
this->aggregate = aggregate;
current = 0;
}
//得到聚集的第一个对象
string First()
{
return aggregate->get(0);
}
//得到聚集的下一个对象
string Next()
{
string ret = "";
current++;
if(current < aggregate->Count())
{
ret = aggregate->get(current);
}
return ret;
}
//判断是否结尾
bool IsEnd()
{
return current >= aggregate->Count() ? true : false;
}
//返回当前聚集对象
string CurrentIterm()
{
return aggregate->get(current);
}
};
#include <iostream>
#include "迭代器模式.h"
using namespace std;
//迭代器模式
Iterator *ConcreteAggregate::CreateIterator()
{
return new ConcreteIterator(this);
}
int main()
{
ConcreteAggregate a;
a.iterms.push_back("小菜");
a.iterms.push_back("大鸟");
a.iterms.push_back("路人甲");
a.iterms.push_back("路人乙");
a.iterms.push_back("路人丙");
a.iterms.push_back("路人丁");
Iterator *i = new ConcreteIterator(&a);
string item = i->First();
while(!i->IsEnd())
{
cout << i->CurrentIterm() <<",请买票。"<<endl;
i->Next();
}
return 1;
}