设计模式学习(二十二) 迭代器模式 Iterator

1.迭代器模式定义

 迭代器模式,官方的定义是“提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。”其理解起来很容易,因为这就是我们常用的C++容器类中的迭代器的基本含义:通过迭代器的循环遍历来访问容器中的各个元素,其中迭代器是指向各个元素的一种指针。
 (所以对于这个模式,我的想法是既然基本容器中已经定义好了,并且很多情况下会比我们自定义的迭代器好用,所以可能只有很少的需要自定义的情况出现时,才会使用这种设计模式吧)

2.迭代器模式的类图

迭代器模式类图
 迭代器模式的类图非常明了,Client客户端类依靠Aggregate对象类和Iterator迭代器类来进行编程,其中Aggregate对象类中有公共接口CreateIterator,其用于创建一个指向自己的迭代器,并返回该迭代器;Iterator迭代器类中有接口First,Next,IsDone和CurrentItem接口,分别用于迭代器索引回零,迭代器后移,判断迭代器是否到达尽头,得到迭代器当前索引所指向的对象数值。

  1. Iterator迭代器类:这是一个抽象类,定义了所有实例迭代器类需要实现的四个接口;
  2. ConcreteIterator实例迭代器类:其继承自Iterator迭代器类,通过对四个接口的实现方式不同,实现迭代器功能的不同。其与ConcreteAggregate实例对象类为单向关联关系,故其需要创建一个对其ConcreteAggregate实例对象类的成员变量,并通过功能函数或构造函数完成对该成员变量的赋值或修改等操作;
  3. Aggregate对象类:这是一个抽象类,定义了一个通用的接口(但是实际使用中往往需要别的接口实现更多的功能);
  4. ConcreteAggregate实例对象类:其继承自Aggregate对象类,在实现基本的创建迭代器函数的同时,也需要注意其与ConcreteIterator实例迭代器类的依赖关系,通常情况下,都是在本类的相关功能函数/构造函数中,调用ConcreteIterator实例迭代器类的相关功能函数/构造函数,将代表自身的指针this当做实参使用。

3.迭代器模式的代码实现

 本例中使用的环境,是一群人在火车站的一个入站口前检票的情况。本例中使用object做宏定义,表示例子中所使用的数据类型(本例默认为string类型)。其中Iterator迭代器类为标准格式,Aggregate对象类中增加了getSize和getCurrentItem两种功能函数。TickerCheck为实例迭代器类,其表示检票器;TicketQueue为实例对象类,其表示检票队伍。通过遍历检票队伍中的所有元素,打印所有元素的当前信息。代码如下:

#include <iostream>
#include <string>
using namespace std;

#define object string
#define QueueSize 10

class Aggregate;

class Iterator
{
public:
	virtual void First() = 0;
	virtual void Next() = 0;
	virtual bool IsDone() = 0;
	virtual object CurrentItem() = 0;
};

class Aggregate
{
public:
	virtual Iterator* CreateIterator() = 0;
	virtual int getSize() = 0;
	virtual object &getCurrentItem(int index) = 0;
};

class TickerCheck : public Iterator
{
public:
	TickerCheck(Aggregate *ag) : aggregate(ag) { m_index = 0; }
	void First()
	{
		m_index = 0;
	}
	void Next()
	{
		++m_index;
	}
	bool IsDone()
	{
		return (m_index == aggregate->getSize());
	}
	object CurrentItem()
	{
		object currentman = aggregate->getCurrentItem(m_index);
		cout << "当前位置为:" << m_index << "号,";
		if (currentman.size())
			cout << "现在是" << aggregate->getCurrentItem(m_index) << "需要买票" << endl;
		else
			cout << "此号为空" << endl;
		return aggregate->getCurrentItem(m_index);
	}
private:
	int m_index;
	Aggregate *aggregate;
};

class TicketQueue : public Aggregate
{
public:
	Iterator* CreateIterator()
	{
		return new TickerCheck(this);
	}
	int getSize()
	{
		return QueueSize;
	}
	object& getCurrentItem(int index)
	{		
		return m_length[index];
	}
private:
	object m_length[QueueSize];
};

int main()
{
	Aggregate* ticketqueue = new TicketQueue;
	ticketqueue->getCurrentItem(0) = "mike";
	ticketqueue->getCurrentItem(1) = "jack";
	ticketqueue->getCurrentItem(2) = "linda";
	ticketqueue->getCurrentItem(3) = "lily";

	Iterator* tickercheck = ticketqueue->CreateIterator();

	for (tickercheck->First(); !(tickercheck->IsDone()); tickercheck->Next())
		tickercheck->CurrentItem();

	delete ticketqueue;
	delete tickercheck;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方寸间沧海桑田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值