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

被折叠的 条评论
为什么被折叠?



