设计模式--迭代器模式(C++实现)

/*************************************************************************
迭代器模式:
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该类内部表示


实现原理: 在迭代器中 持有 一个集合的 引用;所以通过迭代器指针,就可以访问集合
这个模式在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");
}

文章参考来源:传智播客--王保明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值