迭代器模式(Iterator Pattern)用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。
IteratorPattern.h
#pragma once
#include<iostream>
#include<string>
// 模拟对象
typedef int Object;
#define SIZE 5
// 自定义迭代器接口,抽象层
class MyIterator
{
public:
virtual void First(void) = 0; // 指向第一个元素
virtual void Next(void) = 0; // 指向下一个元素
virtual bool IsDone(void) = 0; // 是否已经结束了
virtual Object CurrentItem(void) = 0; // 获取当前项
private:
protected:
};
// 抽象容器,接口
class Aggregate
{
public:
// 创建迭代器
virtual MyIterator* CreateIterator() = 0;
// 获取容器大小
virtual int getSize(void) = 0;
// 获取元素
virtual Object getItem(int index) = 0;
private:
protected:
};
// 具体的迭代器
class ContreteIterator:public MyIterator
{
public:
ContreteIterator(Aggregate* aggregate,int index=0):m_aggregate(aggregate),m_currentIndex(index){}
virtual void First(void)// 指向第一个元素
{
m_currentIndex = 0; // 当前游标置0
}
virtual void Next(void)// 指向下一个元素
{
if (m_currentIndex < m_aggregate->getSize())
{
m_currentIndex++;
}
}
virtual bool IsDone(void)// 是否已经结束了
{
return (m_currentIndex == m_aggregate->getSize());
}
virtual Object CurrentItem(void)// 获取当前项
{
return m_aggregate->getItem(m_currentIndex);
}
private:
int m_currentIndex; // 当前位置
Aggregate* m_aggregate; // 指向容器的指针
protected:
};
// 具体的容器
class ContreteAggregate:public Aggregate
{
public:
ContreteAggregate()
{
for (int i = 0; i < SIZE; i++)
object[i] = i;
}
// 创建迭代器
virtual MyIterator* CreateIterator()
{
return new ContreteIterator(this);
}
// 获取容器大小
virtual int getSize(void)
{
return SIZE;
}
// 获取元素
virtual Object getItem(int index)
{
return object[index];
}
private:
Object object[SIZE]; // 对应的底层数据
protected:
};
class IteratorPattern
{
public:
IteratorPattern() {};
~IteratorPattern() {};
};
IteratorPattern.cpp
#include "IteratorPattern.h"
mainTest.cpp
#include<iostream>
#include<string>
#include "IteratorPattern.h"
int main(void)
{
// 创建一个集合
ContreteAggregate* contreteAggregate = new ContreteAggregate;
// 创建一个迭代器
MyIterator* myIterator= contreteAggregate->CreateIterator();
for (;!(myIterator->IsDone()); myIterator->Next())
{
std::cout<< myIterator->CurrentItem()<<" "<<std::endl;
}
delete myIterator;
delete contreteAggregate;
system("pause");
return 0;
}