参考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是不是严格意义上的聚合类。



