1 含义
迭代器模式是一种行为设计模式, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。
2 模式结构
3 代码实现
举例:电视机遥控器
#include<iostream>
#include <vector>
using namespace std;
//抽象迭代器类TVIterator
class TVIterator
{
public:
virtual void setChannel(int i) = 0;
virtual void next() = 0;
virtual void previous() = 0;
virtual bool isLast() = 0;
virtual string currentChannel() = 0;
virtual bool isFirst() = 0;
};
//具体迭代器类SkyworthIterator
class SkyworthIterator : public TVIterator {
public:
SkyworthIterator(vector<string> &tvs) :tvs(tvs) {
}
void next() {
if (currentIndex < tvs.size()) {
currentIndex++;
}
}
void previous() {
if (currentIndex > 0) {
currentIndex--;
}
}
void setChannel(int i) {
currentIndex = i;
}
string currentChannel() {
return tvs[currentIndex];
}
bool isLast() {
return currentIndex == tvs.size();
}
bool isFirst() {
return currentIndex == 0;
}
private:
vector<string> &tvs;
int currentIndex = 0;
};
//抽象聚合类Television
class Television {
public:
virtual TVIterator* createIterator() = 0;
};
//具体电视机类SkyworthTeleviosion
class SkyworthTelevision : public Television {
public:
TVIterator* createIterator() {
return new SkyworthIterator(tvs);
}
void addItem(string item) {
tvs.push_back(item);
}
private:
vector<string> tvs; //这里是存储数据的数据结构
};
//客户端测试
int main( )
{
SkyworthTelevision tv;
tv.addItem("CCTV-1");
tv.addItem("CCTV-2");
tv.addItem("CCTV-3");
tv.addItem("CCTV-4");
tv.addItem("CCTV-5");
auto iter = tv.createIterator();
while (!iter->isLast()) {
cout << iter->currentChannel().c_str() << endl;
iter->next();
}
}
4 优缺点
4.1 优点
你可将迭代器传递给客户端类,无需让其拥有访问整个集合的权限。这样一来,你就无需将集合暴露给客户端了
4.2 缺点
如果你的程序只与简单的集合进行交互, 应用该模式可能会矫枉过正。
对于某些特殊集合, 使用迭代器可能比直接遍历的效率低。
5 适用场景
为集合和迭代器提供了一些通用接口
大多数语言在实现容器的时候都给提供了迭代器,可以满足我们的需要,所以现在需要我们自己去实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。
参考
1.https://blog.csdn.net/lxq1997/article/details/91467399
2.https://refactoringguru.cn/design-patterns/iterator