设计模式-迭代器模式
迭代器模式结构图
意图:提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示。
主要解决:不同的方式来遍历整个整合对象。
其中:
- Iterator定义访问和遍历元素的接口。
- ConcreteIterator(具体迭代器)实现迭代器接口;对该聚合遍历时跟踪当前位置。
- Aggregate(聚合)定义创建相应迭代器对象的接口。
- ConcreteAggregate(具体聚合)实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
应用举例
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//抽象迭代器类
class Iterator
{
public:
Iterator() {};
virtual ~Iterator() {};
virtual string First() = 0;
virtual void Next() = 0;
virtual string CurrentItem() = 0;
virtual bool IsDone() = 0;
};
//具体迭代器
class ConcreteIterator : public Iterator
{
public:
ConcreteIterator(const vector<string> &t) { strlst = t; }
string First()
{
return strlst.at(0);
}
void Next()
{
if (m_nCurrent < strlst.size())
{
m_nCurrent++;
}
}
string CurrentItem()
{
return strlst[m_nCurrent];
}
bool IsDone()
{
return ((m_nCurrent == strlst.size()) ? true : false);
}
private:
vector<string> strlst;
int m_nCurrent = 0;
};
//抽象聚合类
class Aggregate
{
public:
virtual Iterator* CreateIterator() = 0;
};
//具体聚合类
class ConcreteAggregate : public Aggregate
{
public:
//创建迭代器
Iterator* CreateIterator()
{
if (nullptr == m_pIterator)
{
m_pIterator = new ConcreteIterator(m_strLst);
}
return m_pIterator;
}
void Push(const string& strValue)
{
m_strLst.push_back(strValue);
}
private:
Iterator* m_pIterator = nullptr;
//存储的数据
vector<string> m_strLst;
};
int main()
{
ConcreteAggregate c;
c.Push("张三");
c.Push("李四");
c.Push("王二");
auto iter = c.CreateIterator();
while (!iter->IsDone())
{
cout << iter->CurrentItem() << endl;
iter->Next();
}
getchar();
return 0;
}
适用性
- 访问一个聚合对象的内容而无须暴露它的内部表示。
- 支持对聚合对象的多种遍历。
- 为遍历不同的聚合结构提供一个统一的接口。
还没有评论,来说两句吧...