设计模式学习--迭代器模式

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


  当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。另外,需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前项等统一接口。

  迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。

#include <iostream>
#include <vector>

using namespace std;

typedef string object;										//object为任意数据类型

class AbstractIterator;
class AbstractAggregate;
class RealIterator;
class RealAggregate;

class AbstractIterator										//迭代器抽象类
{
public:
	virtual object Frist() = 0;								//返回迭代器的第一项
	virtual object Next() = 0;								//返回迭代器的下一项
	virtual bool Isdone() = 0;								//判断指针是否访问最后一项
	virtual object current() = 0;							//返回当前项
};

class AbstractAggregate										//集合抽象类
{
public:
	virtual AbstractIterator* CreateIterator() = 0;			//创建迭代器
};

class RealAggregate : public AbstractAggregate				//具体集合类
{
	vector<object> item;									//容器  存放object数据
public:
	AbstractIterator* CreateIterator();						//创建迭代器
	
	int size()												//返回当前总的数据个数
	{
		return item.size();
	}
	
	object& operator[](int index)							//重载运算符 使用[]访问容器中数据
	{
		return item[index];
	}
	
	void addobject(object str)								//容器增加数据
	{
		item.push_back(str);
	}
};

class RealIterator : public AbstractIterator				//迭代器具体类
{
	RealAggregate* m_aggregate;								//指针指向集合
	int curr;												//当前项在迭代器中的位置
public:
	RealIterator(RealAggregate* aggregate):m_aggregate(aggregate)		//传入aggregate curr初始化
	{
		curr = 0;
	}
	
	object Frist()											//返回迭代器的第一项
	{
		return (*m_aggregate)[0];
	}
	
	object Next()											//返回迭代器的下一项
	{
		object temp;
		curr++;
		if(curr < m_aggregate->size())
		{
			temp = (*m_aggregate)[curr];
		}
		return temp;
	}
	
	bool Isdone()											//判断指针是否访问最后一项
	{
		return curr >= m_aggregate->size() ? true : false;
	}
	
	object current()										//返回当前项
	{
		return (*m_aggregate)[curr];
	}
};

AbstractIterator* RealAggregate::CreateIterator()	
{
	return (new RealIterator(this));
}

int main()
{
	RealAggregate *a = new RealAggregate();
	
	a->addobject("小明");
	a->addobject("小王");
	a->addobject("行李");
	a->addobject("老外");
	a->addobject("公交内部员工");
	a->addobject("小偷");
	
	RealIterator* i = new RealIterator(a);
	
	while(!i->Isdone())
	{
		cout<<i->current()<<"  请买车票"<<endl;
		i->Next();
	}
	
	return 0;
}

显示结果:


[hjf@hjf 设计模式]$ ./a.out 
小明  请买车票
小王  请买车票
行李  请买车票
老外  请买车票
公交内部员工  请买车票
小偷  请买车票

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值