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

版权声明:本文为博主原创文章,转载需标明出处。 https://blog.csdn.net/My_heart_/article/details/62887582

迭代器模式(Iterator Pattern)用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。


意图

提供一种方法顺序访问一个聚合 对象中各个元素,而又无需暴露该对象的内部表示。


解决问题

不同的方式遍历整个对象

如何解决

把元素之间游走的责任交给迭代器,而不是聚合对象。


优点

扫描二维码关注公众号,回复: 3467288 查看本文章

1. 支持不同的 方式遍历聚合对象

2. 迭代器模式简化了聚合类

3. 在同一个聚合上可以有多个遍历

4. 在迭代器模式中,增加新的聚合类和迭代器都很方便,无需修改原有代码。

缺点

       由于迭代器模式将存储数据和遍历数据分隔,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂程度。


使用场景

1. 访问一个聚合对象的内容而无需暴露它的内部表示;

2. 需要为聚合对象提供多种遍历方式

3. 为遍历不同的聚合结构提供一个统一的接口

注意事项

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



C++实现

       举例子: 在现在的电视机中,我们使用[后一个]和[前一个]按钮可以很方便的换台,当按下[后一个]按钮时,将切换到下一个预置的频道。想象一下在陌生的城市中的旅店中看电视。当改变频道时,重要的不是几频道,而是节目内容。如果对一个频道的节目不感兴趣,那么可以换下一个频道,而不需要知道它是几频道。


UML类图


code:

//迭代器模式

/*
	1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
	2.具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
	3.集合角色(Aggregate):集合角色负责提供创建具体迭代器角色的接口。
	4.具体集合角色(Concrete Aggregate):具体集合角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该集合的结构相关。
*/

template<class Item> //迭代器角色
class  Iterator
{
public :
	virtual void First() = 0;
	virtual void Next() = 0;
	virtual Item* CurrentItem() = 0;
	virtual bool isDone() = 0;
	virtual ~Iterator()
	{}
};

template<class Item>//集合角色
class  Aggregate
{
public:
	virtual Iterator<Item>* CreateIterator() = 0;
	virtual ~Aggregate()
	{}
};

template<class Item>//具体集合角色
class ConcreteAggregate : public Aggregate<Item>
{
	vector<Item> data;
public:
	ConcreteAggregate()
	{
		data.push_back(1);
		data.push_back(2);
		data.push_back(3);

	}
	virtual Iterator<Item>* CreateIterator()
	{
		return new ConcreteIterator<Item>(this);
	}
	Item& operator[](int index)
	{
		return data[index];
	}

	int GetLen()
	{
		return data.size();
	}
};

template<class Item>
class ConcreteIterator : public Iterator<Item> //具体迭代器
{
	ConcreteAggregate<Item>* aggr;
	int cur;

public:
	ConcreteIterator(ConcreteAggregate<Item>* a)
		:aggr(a)
		, cur(0)
	{}

	virtual void First()
	{
		cur = 0;
	}

	virtual void Next()
	{
		if (cur < aggr->GetLen())
			cur++;
	}
	virtual Item* CurrentItem()
	{
		if (cur < aggr->GetLen())
			return  &(*aggr)[cur];//aggr是指针所以需要先解引用再[],最后返回元素地址
		else
			return NULL;
	}
	virtual bool isDone()
	{
		return (cur >= aggr->GetLen());
	}

};

客户端:

int test_Iterator()  //迭代器模式
{
	Aggregate<int> *aggr = new ConcreteAggregate<int>();
	Iterator<int>* it = aggr->CreateIterator();//这里的设计挺秒

	for (it->First(); ! it->isDone(); it->Next())//遍历
	{
		cout << *(it->CurrentItem()) << endl;
	}

	delete it;
	delete aggr;

	system("pause");
	return 0;
}



学习建议:  看看STL里面的迭代器实现吧 ,很经典


猜你喜欢

转载自blog.csdn.net/My_heart_/article/details/62887582