定义:提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
1、迭代器角色(Iteractor): 负责定义访问和遍历元素的接口
2、具体迭代器角色(Concrete Iteractor): 实现迭代器接口,并要记录遍历中的当前位置
3、集合角色(Aggregate): 负责提供创建具体迭代器角色的接口
4、具体集合角色(Concrete Aggregate): 实现创建具体迭代器角色的接口---这个具体迭代器角色于该集合的结构相关
#include <iostream>
#include <vector>
using namespace std;
template<typename Item>
class Iteractor
{
public:
virtual void First() = 0;
virtual void Next() = 0;
virtual Item* CurrentItem() = 0;
virtual bool isDone() = 0;
};
template<typename Item>
class ConcreteAggregate;
// 具体迭代器
template<typename Item>
class ConcreteIterator : public Iteractor<Item>
{
public:
ConcreteIterator(ConcreteAggregate<Item>* a) : aggr(a), cur(0) {}
void First()
{
cur = 0;
}
void Next()
{
if (cur < aggr->GetLen())
cur++;
}
Item* CurrentItem()
{
if (cur < aggr->GetLen())
return &(*aggr)[cur]; // aggr是指针,所以需要先解引用再[],最后返回元素地址
else
return NULL;
}
bool isDone()
{
return (cur >= aggr->GetLen());
}
private:
ConcreteAggregate<Item>* aggr;
int cur;
};
// 集合角色
template<typename Item>
class Aggregate
{
public:
virtual Iteractor<Item>* CreateInterator() = 0;
};
// 具体集合角色
template<typename Item>
class ConcreteAggregate : public Aggregate<Item>
{
public:
ConcreteAggregate()
{
data.push_back(1);
data.push_back(2);
data.push_back(3);
}
Iteractor<Item>* CreateInterator()
{
return new ConcreteIterator<Item>(this);
}
Item& operator[](int index)
{
return data[index];
}
int GetLen()
{
return data.size();
}
private:
vector<Item > data;
};
void test_01()
{
Aggregate<int>* aggr = new ConcreteAggregate<int>;
Iteractor<int>* it = aggr->CreateInterator();
for (it->First(); !it->isDone(); it->Next())
{
cout << *(it->CurrentItem()) << endl;
}
delete it;
delete aggr;
}
int main()
{
test_01();
system("pause");
return 0;
}