迭代器模式是一种行为型设计模式,它提供了一种顺序访问集合对象元素的方法,而无需暴露其底层实现。通过使用迭代器模式,我们可以在不了解集合内部结构的情况下遍历集合中的元素。
迭代器模式的核心概念是迭代器(Iterator)接口,该接口定义了访问和遍历集合元素的方法。具体的集合类实现迭代器接口,并提供了用于创建迭代器对象的方法。
使用迭代器模式的好处是,它将集合类的遍历行为与集合类本身分离开来,使得我们可以独立地改变遍历算法,而不需要修改集合类的代码。这样一来,我们可以根据不同的需求选择不同的遍历方式,而无需修改现有代码。
迭代器模式在实际应用中非常常见,例如在编程语言中的循环结构、容器类的遍历等场景都可以使用迭代器模式来实现。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//迭代器抽象类
class Iterator
{
public:
() {};
Iteratorvirtual ~Iterator(){}
virtual string First() = 0;
virtual string Next() = 0;
virtual string CurrentItem() = 0;
virtual bool IsDone() = 0;
};
//聚集抽象类
class Aggregate
{
public:
virtual int Count() = 0;
virtual void Push(const string& strValue) = 0;
virtual string Pop(const int nIndex) = 0;
virtual Iterator* CreateIterator() = 0;
};
//具体迭代器
class ConcreIterator :public Iterator
{
public:
(Aggregate* pAggregate):Iterator(),m_nCurrent(0)
ConcreIterator{
m_Aggregate = pAggregate;
}
()
string First{
return m_Aggregate->Pop(0);
}
() {
string Next;
string strRetm_nCurrent++;
if (m_nCurrent < m_Aggregate->Count())
{
= m_Aggregate->Pop(m_nCurrent);
strRet }
return strRet;
}
()
string CurrentItem{
return m_Aggregate->Pop(m_nCurrent);
}
bool IsDone()
{
return (m_nCurrent >= m_Aggregate->Count());
}
private:
* m_Aggregate;
Aggregateint m_nCurrent;
};
//具体聚集类
class ConcreteAggregate :public Aggregate
{
public:
() :Aggregate(),m_pIterator(nullptr), m_vecItems({})
ConcreteAggregate{
}
~ConcreteAggregate()
{
if (m_pIterator)
{
delete m_pIterator;
m_pIterator = nullptr;
}
}
* CreateIterator()
Iterator{
if (nullptr == m_pIterator)
{
m_pIterator = new ConcreIterator(this);
}
return m_pIterator;
}
int Count()
{
return m_vecItems.size();
}
void Push(const string& strValue) {
m_vecItems.push_back(strValue);
}
(const int nIndex)
string Pop{
;
string strRetif (nIndex < Count())
{
= m_vecItems[nIndex];
strRet }
return strRet;
}
private:
<string> m_vecItems;
vector* m_pIterator;
Iterator};
int main()
{
* pName = new ConcreteAggregate();
ConcreteAggregateif (!pName)
{
return -1;
}
->Push("hello");
pName->Push("world");
pName->Push("wanlu");
pName* iter = pName->CreateIterator();
Iteratorif (!iter) {
delete pName;
return -1;
}
= iter->First();
string strItem while (!iter->IsDone())
{
<< iter->CurrentItem() << endl;
cout ->Next();
iter}
delete pName;
return 0;
}
//hello
//world
//wanlu