【C++设计模式】迭代器模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值