设计模式学习[18]---迭代器模式

前言

在C++11中,我们使用的vector,list,map等容器时,需要遍历容器中的每一个对象时,通常使用迭代器进行访问,似乎已经是约定俗成,但是为什么用迭代器呢?

1.定义

对于使用vector类似的容器时,它内部所含的数据的类型是不固定的,我可以放int,string,也可以放自己的自定义类,亦可以放一个容器。功能很强大,但是难道我对于每一个类型的遍历等操作,都要在这个vector类里面去做吗?这必然不现实,不仅仅是工作量的问题,同时也违反了软件设计时的一些考量因素,比如单一职责,低内聚高耦合。

所以我们能否将这种遍历的操作,提取出来,抽象成一个操作的类,我们通过这个类去专门访问容器,这样容器这个类自身的职责就比较单一,比如它只记录数据的大小,以及存放数据。至于取数据和存数据这种操作,就可以交给操作类去做。

由此我们引出迭代器模式的定义:

迭代器模式:提供一种方法顺序访问一个聚合对象(容器)中各个元素,而又不暴露该对象的内部表示(实现代码)

迭代器模式在平常开发中用的比较少,下面举一个例子便于理解,不考虑例子的性能。

2.举例

在这个例子中, m y C o n t a i n e r myContainer myContainer m y I t e r myIter myIter两个抽象类,分别表示抽象容器,抽象迭代器,它们将容器和迭代器的一些固定操作独立出来,供子类继承。

这里我们定义一个 m y V e c t o r myVector myVector类,内部容器长度固定为10,简单实现通过迭代器来访问自定义容器内部数据。

迭代器模式的好处就在于,容器可以自定义,不同容器对应不同的迭代器,另外开辟新类去访问数据,而不用在其他的迭代器类中不断的加新的业务,做到单一职责。

#include <iostream>

template<typename T>
class myIter
{
public:
	virtual void First() = 0;		//指向容器中的第一个元素
	virtual void Next() = 0;		//指向下一个元素
	virtual bool IsDone() = 0;		//是否遍历完
	virtual T& CurrentItem() = 0;	//获取当前的元素
	virtual ~myIter() {	}			//作为父类时析构函数应该为虚函数
};

template<typename T>
class myContainer
{
public:
	virtual myIter<T>* CreateIterator() = 0;	//创建迭代器
	virtual T& getItem(int index) = 0;			//获取当前元素
	virtual int getSize() = 0;					//容器中元素的数量
	virtual ~myContainer(){}					//作为父类时析构函数应该为虚函数
};

//具体的迭代器类模板
template<typename T>
class myVectorIter :public myIter<T>
{
public:
	myVectorIter(myContainer<T>* tmpc) :myvector(tmpc) { m_current = 0; }
	virtual void First() { m_current = 0; };		//指向容器中的第一个元素
	virtual void Next() { ++m_current; };		//指向下一个元素
	virtual bool IsDone()
	{
		if (m_current >= myvector->getSize())
			return true;
		return false;
	}
	virtual T& CurrentItem() { return myvector->getItem(m_current); }	//获取当前的元素

private:
	myContainer<T>* myvector;
	int m_current;
	
};

//具体容器类模板
template<typename T>
class myVector:public myContainer<T>
{
public:
	myVector()
	{
		for (int i = 0; i < 10; i++)
			m_elem[i] = i;
	}
	virtual myIter<T>* CreateIterator()
	{
		return new myVectorIter<T>(this);
	}
	virtual T& getItem(int index)
	{
		return m_elem[index];
	}//获取当前元素
	virtual int getSize()
	{
		return 10;
	}

private:
	T m_elem[10];
};

int main()
{
	myContainer<int>* m_pContainer = new myVector<int>();
	myIter<int>* iter = m_pContainer->CreateIterator();
	for (iter->First();!iter->IsDone();iter->Next())
	{
		std::cout << iter->CurrentItem() << std::endl;
	}
	delete iter;
	delete m_pContainer;
}


总结

虽然C++中内置了很多容器并提供了对应的迭代器,在这种情况下,自己去实现迭代器的机会很少,所以对于个人来说迭代器模式更像是软件设计中的一些规则的运用,高内聚低耦合的实现,单一职责原则等,这些设计思想还是非常值得学习和借鉴的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澄澈i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值