学设计模式的伙伴肯定用过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;
}