c++设计模式之迭代器模式 学习笔记

学设计模式的伙伴肯定用过STL,而用过STL的应该没有不知道迭代器的,这个模式就是教我们怎么实现迭代器。
迭代器是容器和算法的桥梁,是二者联系的纽带。它提供了遍历容器元素的方法。所以有迭代器就有与之相互匹配的容器。
那么首先回想一下迭代器的几个常用功能:
①获得第一个元素②追踪下一个元素③判断是不是到了最后一个元素了④索引特点index的元素⑤移除固定index的元素… …
然后回想容器的几个常用功能:
①塞入数据②取出数据③查询容器中数据个数④创建迭代器😀… …

下面直接上代码,学习一下迭代器模式(代码只实现迭代器的前三个必备功能)

#include<iostream>
#include<string>
#include<vector>
using namespace std;


class Iterator;
/*抽象的容器*/
class Container
{
public:
	virtual void push(const string & newElem) = 0; //这里假设容器中存的string的参数了,不做模板了
	virtual string pop(int index) = 0;
	virtual int countNumber() = 0;
	virtual Iterator* createIterator() = 0;

};
/*抽象的迭代器*/
class Iterator
{
public:
	virtual string first() = 0; //这里假设容器中存的string的参数类型,不做模板了
	virtual string next() = 0;
	virtual bool isEnd() = 0;

};
/*实际的迭代器*/
class concreateIterator :public Iterator
{
public:
	concreateIterator(Container * container):m_container(container), m_countElem(0)
	{

	}
	string first()
	{
		return m_container->pop(0);
	}
	string next()
	{
		m_countElem++;
		if (m_countElem < m_container->countNumber())
		{
			return m_container->pop(m_countElem);
		}
		else
			return "";
	}
	bool isEnd()
	{
		return m_countElem >= m_container->countNumber() ? true : false;
	}
protected:
	Container * m_container;
	int m_countElem;

};

/*实际的容器*/
class concreateContainer :public Container
{
public:
	concreateContainer() :m_iterator(NULL)
	{

	}
	~concreateContainer()
	{
		if (m_iterator != NULL)
		{
			delete m_iterator;
			m_iterator = NULL;
		}
	}
	void push(const string & newElem)
	{
		needContainer.push_back(newElem);
	}
	string pop(int index)
	{
		if (index < countNumber())
			return needContainer.at(index);
		else
			return "";
	}
	int countNumber()
	{
		return needContainer.size();
	}
	Iterator* createIterator()
	{
		if (m_iterator == NULL)
		{
			m_iterator = new concreateIterator(this);
		}
		return m_iterator;
	}
protected:
	vector<string> needContainer;  //本来自己编写源码实现定义的容器功能比较好,但这里我们只是为了阐述该模式,所以借用一下已经封装好的vector容器
	Iterator * m_iterator;
};

void main()
{
	concreateContainer * my_container = new concreateContainer; //new一个容器
	my_container->push("我");
	my_container->push("是");
	my_container->push("泡");
	my_container->push("泡");
	my_container->push("大");
	my_container->push("魔");
	my_container->push("王");

	Iterator *my_iterator = my_container->createIterator(); //通过容器生成它的专属迭代器

	cout << my_iterator->first();
	while (my_iterator != NULL)
	{
		cout << my_iterator->next();
	}
	system("pause");
    return;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值