/*************************************************************************
迭代器模式:
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该类内部表示
实现原理: 在迭代器中 持有 一个集合的 引用;所以通过迭代器指针,就可以访问集合
这个模式在STL中迭代器的实现原理来源于此
有的迭代进行了封装含有两个成员变量:比如在操作Map的迭代器的时候就有两个成员
iter->fisrt iter->second
实现方法:
创建一个集合类 + 一个迭代器类
在迭代器中完成对对象的遍历 在集合中完成对对象的返回集合中的下标或者元素或者集合大小
在集合中将此类的对象中创建迭代器对象,
并将集合的地址赋值给具体的迭代器中集合(在此处完成迭代器中包含聚合对象的指针或引用)的引用
**************************************************************************/
#include <iostream>
using namespace std;
typedef int Object;
#define SIZE 5
class MyIterator
{
public:
virtual void First() = 0;
virtual void Next() = 0;
virtual bool IsDone() = 0;
virtual Object CurrentItem() = 0;
};
class Aggregate
{
public:
virtual Object getItem(int index) = 0;//得到数组下标
virtual MyIterator *CreateIterator() = 0;//返回指向当前对象的指针
virtual int getSize() = 0;//返回数组大小
};
class ContreteIterator : public MyIterator
{
public:
ContreteIterator(Aggregate *ag){//在迭代器中持有集合的引用
_ag = ag;//迭代器指针指向传来的聚合类
_idx = 0;
}
~ContreteIterator(){
_ag = NULL;
_idx = 0;}
virtual void First(){//迭代器下标初始化为0
_idx = 0;}
virtual void Next(){
if (_idx <_ag->getSize())//得到创建集合的大小
{
_idx++;
}
}
virtual bool IsDone(){
return (_idx == _ag->getSize());//判断迭代器是否到末端
}
virtual Object CurrentItem(){
return _ag->getItem(_idx);//得到集合中下标为_idx的内容
}
private:
int _idx;
Aggregate *_ag;
};
class ConcreteAggregate : public Aggregate
{
public:
ConcreteAggregate()
{
for (int i = 0; i<SIZE; i++)
{
object[i] = i + 1;
}//创建一个集合赋值为1,2,3,4,5
}
virtual ~ConcreteAggregate()
{ }
virtual Object getItem(int index)
{
return object[index];//返回集合中的内容
}
virtual MyIterator *CreateIterator()
{
return new ContreteIterator(this);//将当前对象返回给迭代指针进行初始化,并使基类指针指向此对象
}
virtual int getSize()
{
return SIZE;//返回集合大小
}
private:
Object object[SIZE];
};
void main()
{
Aggregate *ag = new ConcreteAggregate(); // 创建一个集合
MyIterator *it = ag->CreateIterator();// 创建一个遍历这个集合的 迭代器
for (; !(it->IsDone()); it->Next())//通过迭代器 遍历 集合
{ cout << it->CurrentItem() << " ";}
delete it;//清理相关资源
delete ag;
system("pause");
}
迭代器模式:
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该类内部表示
实现原理: 在迭代器中 持有 一个集合的 引用;所以通过迭代器指针,就可以访问集合
这个模式在STL中迭代器的实现原理来源于此
有的迭代进行了封装含有两个成员变量:比如在操作Map的迭代器的时候就有两个成员
iter->fisrt iter->second
实现方法:
创建一个集合类 + 一个迭代器类
在迭代器中完成对对象的遍历 在集合中完成对对象的返回集合中的下标或者元素或者集合大小
在集合中将此类的对象中创建迭代器对象,
并将集合的地址赋值给具体的迭代器中集合(在此处完成迭代器中包含聚合对象的指针或引用)的引用
**************************************************************************/
#include <iostream>
using namespace std;
typedef int Object;
#define SIZE 5
class MyIterator
{
public:
virtual void First() = 0;
virtual void Next() = 0;
virtual bool IsDone() = 0;
virtual Object CurrentItem() = 0;
};
class Aggregate
{
public:
virtual Object getItem(int index) = 0;//得到数组下标
virtual MyIterator *CreateIterator() = 0;//返回指向当前对象的指针
virtual int getSize() = 0;//返回数组大小
};
class ContreteIterator : public MyIterator
{
public:
ContreteIterator(Aggregate *ag){//在迭代器中持有集合的引用
_ag = ag;//迭代器指针指向传来的聚合类
_idx = 0;
}
~ContreteIterator(){
_ag = NULL;
_idx = 0;}
virtual void First(){//迭代器下标初始化为0
_idx = 0;}
virtual void Next(){
if (_idx <_ag->getSize())//得到创建集合的大小
{
_idx++;
}
}
virtual bool IsDone(){
return (_idx == _ag->getSize());//判断迭代器是否到末端
}
virtual Object CurrentItem(){
return _ag->getItem(_idx);//得到集合中下标为_idx的内容
}
private:
int _idx;
Aggregate *_ag;
};
class ConcreteAggregate : public Aggregate
{
public:
ConcreteAggregate()
{
for (int i = 0; i<SIZE; i++)
{
object[i] = i + 1;
}//创建一个集合赋值为1,2,3,4,5
}
virtual ~ConcreteAggregate()
{ }
virtual Object getItem(int index)
{
return object[index];//返回集合中的内容
}
virtual MyIterator *CreateIterator()
{
return new ContreteIterator(this);//将当前对象返回给迭代指针进行初始化,并使基类指针指向此对象
}
virtual int getSize()
{
return SIZE;//返回集合大小
}
private:
Object object[SIZE];
};
void main()
{
Aggregate *ag = new ConcreteAggregate(); // 创建一个集合
MyIterator *it = ag->CreateIterator();// 创建一个遍历这个集合的 迭代器
for (; !(it->IsDone()); it->Next())//通过迭代器 遍历 集合
{ cout << it->CurrentItem() << " ";}
delete it;//清理相关资源
delete ag;
system("pause");
}
文章参考来源:传智播客--王保明