定义
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
场景:我们有两个聚合A和B,有一个聚合管理的类,包含聚合A和B,而这个管理类的功能就是依次遍历它所包含的聚合中的元素并打印到控制台上。每个聚合中的元素存放的方式是不同的,有的用的是数组,有的可能是vector或者list等,因此我为每个聚合定义了一个迭代器,管理类只需要依次获取各聚合的迭代器,使用迭代器去遍历其中的元素,而不需要去理会聚合中元素的存放方式。
类图:
代码:
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
#define COUNT 5
/// <summary>
/// 遍历迭代器抽象类
/// </summary>
class Iter
{
public:
virtual bool HasNext() = 0;
virtual int GetNext() = 0;
};
class Menu
{
public:
virtual Iter* CreateIter() = 0;
};
class AIter : public Iter
{
public:
AIter::AIter(vector<int> vData)
{
m_iPosition = 0;
for (int i=0; i<vData.size(); ++i)
{
m_vData.push_back(vData.at(i));
}
}
bool AIter::HasNext()
{
if (m_iPosition < m_vData.size())
{
return true;
}
else
{
return false;
}
}
int AIter::GetNext()
{
int iData = m_vData.at(m_iPosition);
++m_iPosition;
return iData;
}
private:
vector<int> m_vData;
int m_iPosition;
};
class BIter : public Iter
{
public:
BIter::BIter(int* piData)
{
m_iPosition = 0;
for (int i=0; i<COUNT; ++i)
{
m_iData[i] = piData[i];
}
}
bool BIter::HasNext()
{
if (m_iPosition < COUNT)
{
return true;
}
else
{
return false;
}
}
int BIter::GetNext()
{
int iData = m_iData[m_iPosition];
++m_iPosition;
return iData;
}
private:
int m_iPosition;
int m_iData[COUNT];
};
class A : public Menu
{
public:
A::A()
{
for (int i=0; i<COUNT; ++i)
{
m_vData.push_back(i*(i+1));
}
}
Iter* A::CreateIter()
{
return new AIter(m_vData);
}
private:
vector<int> m_vData;
};
class B : public Menu
{
public:
B::B()
{
for (int i = 0; i < COUNT; ++i)
{
m_iData[i] = i*(i+1);
}
}
Iter* B::CreateIter()
{
return new BIter(m_iData);
}
private:
int m_iData[COUNT];
};
class Mgr
{
public:
void Mgr::printAggr()
{
Iter* piter1 = m_aggrA.CreateIter();
Iter* piter2 = m_aggrB.CreateIter();
printAggr(piter1);
printAggr(piter2);
delete piter1;
delete piter2;
}
void Mgr::printAggr(Iter* piter)
{
while(piter->HasNext())
{
printf("%d\n",piter->GetNext());
}
}
private:
A m_aggrA;
B m_aggrB;
};
int main()
{
Mgr aggrMg;
aggrMg.printAggr();
return 0;
}