版权声明:本文为博主原创文章,转载需标明出处。 https://blog.csdn.net/My_heart_/article/details/62887582
迭代器模式(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是指针所以需要先解引用再[],最后返回元素地址
else
return 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里面的迭代器实现吧 ,很经典