Iterator

迭代器

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

适用性

  • 访问一个聚合对象的内容而无需暴露它的内部表示。
  • 支持对聚合对象的多种遍历。
  • 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。

结构

Iterator Class
Iterator Class

Iterator - 迭代器定义访问和遍历元素的接口。
ConcreteIterator - 具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
Aggregate - 聚合定义创建相应迭代器对象的接口。
ConcreteAggregate - 具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。

协作:
ConcreteIterator跟踪聚合中的当前对象,并能够计算出待遍历的后继对象。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
template <typename Item>
class ConcreteAggregate;
//---------------------------------------------------
template <typename Item>
class Iterator
{
public:
virtual void first() = 0;
virtual void next() = 0;
virtual bool is_done() const = 0;
virtual Item& current_item() = 0;
};
//---------------------------------------------------
template <typename Item>
class Aggregate
{
public:
virtual Iterator<Item>* create_iterator() = 0;
virtual long count() const = 0;
virtual Item& get(long index) = 0;
};
//---------------------------------------------------
template <typename Item>
class ConcreteIterator : public Iterator<Item>
{
public:
ConcreteIterator(ConcreteAggregate<Item>* aAggregate);
virtual void first();
virtual void next();
virtual bool is_done() const;
virtual Item& current_item();
protected:
ConcreteAggregate<Item>* m_aggregate;
long m_current;
};
//---------------------------------------------------
template <typename Item>
class ConcreteAggregate : public Aggregate<Item>
{
public:
virtual Iterator<Item>* create_iterator();
virtual long count() const {return 5;}
virtual Item& get(long index)
{

if (index > 4) throw;
return m_array[index];
}
protected:
Item m_array[5];
};
//---------------------------------------------------
template <typename Item>
ConcreteIterator<Item>::ConcreteIterator( ConcreteAggregate<Item>* aAggregate ):m_aggregate(aAggregate), m_current(0)
{}
template <typename Item>
void ConcreteIterator<Item>::first()
{
m_current = 0;
}
template <typename Item>
void ConcreteIterator<Item>::next()
{
++m_current;
}
template <typename Item>
bool ConcreteIterator<Item>::is_done() const
{
return m_current >= m_aggregate->count();
}
template <typename Item>
Item& ConcreteIterator<Item>::current_item()
{
if (is_done())
{
std::cout << "Iterator Out of Bounds" << std::endl;
throw;
}
return m_aggregate->get(m_current);
}
//---------------------------------------------------
template <typename Item>
Iterator<Item>* ConcreteAggregate<Item>::create_iterator()
{
return new ConcreteIterator<Item>(this);
}
//---------------------------------------------------
int main()
{

Aggregate<char>* numbers = new ConcreteAggregate<char>();
Iterator<char>* it = numbers->create_iterator();
// set value
char index('a');
for (it->first(); !it->is_done(); it->next())
{
it->current_item() = index;
++index;
}
for (it->first(); !it->is_done(); it->next())
{
std::cout << it->current_item() << " ";
}
std::cout << std::endl;
system("Pause");
}

相关模式

  • Composite: 迭代器常被应用到像复合这样的递归结构上。
  • Factory Method: 多态迭代器靠Factory Method来例化适当的迭代器子类。
  • Memento: 常与迭代器模式一起使用。迭代器可使用一个memento来捕获一个迭代的状态。迭代器在其内部存储memento。

[1] 设计模式:可复用面向对象软件的基础
[2] Head First设计模式