iterator迭代器模式

参考1 网友k_eckel 的书籍《设计模式精讲-GoF 23种设计模式解析附C++实现源码》

23种设计模式 3 行为型模式 之3.10 iterator迭代器模式

  • [0 前言](#0 前言)
  • [1 问题](#1 问题)
  • [2 模式选择](#2 模式选择)
  • [3 实现](#3 实现)
    • [3.1 aggregate.h](#3.1 aggregate.h)
    • [3.2 aggregate.cpp](#3.2 aggregate.cpp)
    • [3.3 iterator.h](#3.3 iterator.h)
    • [3.4 iterator.cpp](#3.4 iterator.cpp)
    • [3.5 main.cpp](#3.5 main.cpp)
    • [3.6 代码说明](#3.6 代码说明)
  • [4 讨论](#4 讨论)
  • [5 总结](#5 总结)
  • [6 补充](#6 补充)
    • [aggregate 聚合类](#aggregate 聚合类)

0 前言

iterator迭代器模式

1 问题

iterator模式应该是最熟悉的模式了(作者之前一些模式中有使用),最简单的证明就是我在实现composite模式、flyweight模式、observer模式中就直接用到了STL提供的Iterator来遍历Vector或者List 数据结构。

Iterator 模式也正是用来解决一个聚合对象的遍历问题。将聚合的遍历封装到一个类中进行,这样就避免了暴露这个聚合对象的内部表示的可能。

2 模式选择

iterator 模式中定义的对外接口可以视客户成员的便捷定义,但是基本的接口在图中的iterator中已经给出了(参考STL的iterator就知道了)。

3 实现

这里由于名字空间冲突,所以iterator 类名修改为my_iterator;

3.1 aggregate.h

c 复制代码
#ifndef __AGGREGATE_H_
#define __AGGREGATE_H_

class my_iterator;
typedef int object;
class interator;

class aggregate
{
public:
	virtual ~aggregate();
	virtual my_iterator* create_my_iterator() = 0;
	virtual object get_item(int idx) = 0;
	virtual int get_size() = 0;
protected:
	aggregate();

private:
};

class concrete_aggregate:public aggregate
{
public:
	enum {SIZE = 3};
	concrete_aggregate();
	~concrete_aggregate();
	my_iterator* create_my_iterator();
	object get_item(int idx);
	int get_size();
protected:

private:
	object _objs[SIZE];

};

#endif //~~__AGGREGATE_H_

3.2 aggregate.cpp

c 复制代码
#include "aggregate.h"
#include "my_iterator.h"
#include <iostream>
using namespace std;

aggregate::aggregate()
{
	
}

aggregate::~aggregate()
{
	
}

concrete_aggregate::concrete_aggregate()
{
	for(int i = 0; i < SIZE; i++)
		_objs[i] = i;
}

concrete_aggregate::~concrete_aggregate()
{

}

my_iterator* concrete_aggregate::create_my_iterator()
{
	return new concrete_my_iterator(this);
}

object concrete_aggregate::get_item(int idx)
{
	if(idx < this->get_size())
		return _objs[idx];
	else
		return -1;
}

int concrete_aggregate::get_size()
{
	return SIZE;
}

3.3 iterator.h

c 复制代码
#ifndef __ITERATOR_H_
#define __ITERATOR_H_

class aggregate;
typedef int object;

class my_iterator
{
public:
	virtual ~my_iterator();
	virtual void first() = 0;
	virtual void next() = 0;
	virtual bool is_done() = 0;
	virtual object current_item() = 0;
protected:
	my_iterator();
private:

};

class concrete_my_iterator:public my_iterator
{
public:
	concrete_my_iterator(aggregate* ag, int idx = 0);
	~concrete_my_iterator();
	void first();
	void next();
	bool is_done();
	object current_item();
protected:

private:
	aggregate* _ag;
	int _idx;

};

#endif //~~__ITERATOR_H_

3.4 iterator.cpp

c 复制代码
#include "my_iterator.h"
#include "aggregate.h"
#include <iostream>

my_iterator::my_iterator()
{

}

my_iterator::~my_iterator()
{

}

concrete_my_iterator::concrete_my_iterator(aggregate* ag, int idx)
{
	this->_ag = ag;
	this->_idx = idx;
}

concrete_my_iterator::~concrete_my_iterator()
{

}

object concrete_my_iterator::current_item()
{
	return _ag->get_item(_idx);
}

void concrete_my_iterator::first()
{
	_idx = 0;
}

void concrete_my_iterator::next()
{
	if(_idx < _ag->get_size())
		_idx++;
}

bool concrete_my_iterator::is_done()
{
	return (_idx == _ag->get_size());
}

3.5 main.cpp

c 复制代码
#include "my_iterator.h"
#include "aggregate.h"

#include <iostream>
using namespace std;


int main(int argc, char* argv[])
{
	aggregate* ag = new concrete_aggregate();
	my_iterator* it = new concrete_my_iterator(ag);
	for(; !(it->is_done()); it->next())
	{
		cout << it->current_item() << endl;
	}

	return 0;
}

运行结果

3.6 代码说明

iterator 模式的实现代码很简单,实际上为了更好地保护aggregate的状态,我们可以尽量减小aggregate的public接口,而通过将iterator对象声明为aggregate的友员来给予iterator一些特权,获得访问aggregate私有数据和方法的机会。

4 讨论

iterator 模式的应用很常见,我们在开发中经常会用到STL 中预定义的iterator来对STL类进行遍历(Vector、Set等)

5 总结

iterator 模式,将操作类aggregate class化,同时将iterator 作为aggregate的友员,通过iterator来访问aggregate操作,提高aggregate的封装性

Iterator 模式也正是用来解决一个聚合对象的遍历问题。将聚合的遍历封装到一个类中进行,这样就避免了暴露这个聚合对象的内部表示的可能。

6 补充

aggregate 聚合类

aggregate class 是c++中定义的一种特殊的类类型,它允许使用花括号{}来初始化其成员。

如果从一些定义上来说,上面的代码aggregate是不是严格意义上的聚合类。



相关推荐
懵萌长颈鹿2 天前
迭代器模式 (Iterator Pattern)
迭代器模式
小码过河.2 天前
设计模式——迭代器模式
设计模式·迭代器模式
Engineer邓祥浩12 天前
设计模式学习(18) 23-16 迭代器模式
学习·设计模式·迭代器模式
JavaBoy_XJ1 个月前
行为型-迭代器模式
迭代器模式
__万波__1 个月前
二十三种设计模式(十六)--迭代器模式
java·设计模式·迭代器模式
Yeniden1 个月前
Deepeek用大白话讲解 --> 迭代器模式(企业级场景1,多种遍历方式2,隐藏集合结构3,Java集合框架4)
java·开发语言·迭代器模式
老朱佩琪!2 个月前
Unity迭代器模式
unity·设计模式·迭代器模式
563471002 个月前
信用风险传播机制 金融网络传播模型 感染率 初始感染比例 matlab编写代码程序 复杂网络
迭代器模式
开心香辣派小星2 个月前
23种设计模式-14迭代器模式
设计模式·迭代器模式