1、迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而不是暴露该对象的内部表示。
2、一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始,下一个,是否结束,当前哪一项等统一的接口。
UML图如下:
3、当你需要对聚集有多种遍历方式时,可以考虑用迭代器模式。迭代器模式(Iterator)就是分离了集合对象的遍历行为,抽象为一个迭代器类来负责,这样即可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
4、C++代码实现
- #include <iostream>
- #include <string>
- #include <vector>
- using namespace std;
- /* 迭代器抽象类 */
- class Iterator
- {
- public:
- virtual string First() = 0;
- virtual string Next() = 0;
- virtual bool IsDone() = 0;
- virtual string CurrentItem() = 0;
- };
- /* Aggregate聚集抽象类 */
- class Aggregate
- {
- public:
- virtual Iterator * CreateIterator() = 0;
- };
- /* 具体聚集类,继承Aggregate */
- class ConcreteAggregate : public Aggregate
- {
- private:
- vector<string> v;
- public:
- /* 创建迭代器 */
- Iterator * CreateIterator();
- int Count();
- string & operator[](int);
- };
- /* ConcreteIterator具体迭代器类,继承Iterator */
- class ConcreteIterator : public Iterator
- {
- private:
- /* 定义一个具体聚集对象 */
- ConcreteAggregate * p_aggregate;
- int current;
- public:
- /* 初始化时候将具体的聚集对象传入 */
- ConcreteIterator(ConcreteAggregate *);
- string First();
- string Next();
- bool IsDone();
- string CurrentItem();
- };
- ConcreteIterator::ConcreteIterator(ConcreteAggregate * p_aggregate)
- {
- ConcreteIterator::p_aggregate = p_aggregate;
- current = 0;
- }
- /* 得到聚集的第一个对象 */
- string ConcreteIterator::First() {
- return (*p_aggregate)[0];
- }
- /* 得到聚集的下一个对象 */
- string ConcreteIterator::Next() {
- string p = "";
- current++;
- if (current < p_aggregate->Count()) {
- p = p_aggregate->operator [](current);
- }
- return p;
- }
- /* 判断当前是否遍历到结尾,到结尾返回true。 */
- bool ConcreteIterator::IsDone()
- {
- return current >= p_aggregate->Count() ? true : false;
- }
- string ConcreteIterator::CurrentItem() {
- return p_aggregate->operator [](current);
- }
- Iterator * ConcreteAggregate::CreateIterator()
- {
- return new ConcreteIterator(this);
- }
- int ConcreteAggregate::Count()
- {
- return v.size();
- }
- string& ConcreteAggregate::operator [](int index) {
- if (index >= v.size()) {
- v.push_back("empty");
- }
- return v[index];
- }
- int main()
- {
- ConcreteAggregate aggregate;
- string a = "大鸟";
- string b = "小菜";
- string c = "行李";
- string d = "老外";
- string e = "公交内部人员";
- string f = "小偷";
- aggregate[0] = a;
- aggregate[1] = b;
- aggregate[2] = c;
- aggregate[3] = d;
- aggregate[4] = e;
- aggregate[5] = f;
- Iterator * it = aggregate.CreateIterator();
- string p_item = it->First();
- while (!it->IsDone()) {
- cout << it->CurrentItem() << " 请买车票!" << endl;
- it->Next();
- }
- return 0;
- }