迭代器模式(Iterator 模式)
背景 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明的访问其中包含的元素,同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。 方法 提供一种方法顺序访问一个聚合对象中的各个元素,又不暴露(稳定)该对象的内部表示。 迭代特点 迭代抽象:访问一个聚合对象的内容不用暴露其内部表示。 迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。 缺点 从迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构会导致问题。
//Aggregate.h #pragma once class Iterator; class Aggregate { public: virtual Iterator* NewConcreteIterator() = 0; virtual int GetElement(int index) = 0; virtual int GetSize() = 0; virtual ~Aggregate(); protected: Aggregate(); }; class ConcreteAggregate :public Aggregate { public: enum { size = 10 }; ConcreteAggregate(); ~ConcreteAggregate(); Iterator* NewConcreteIterator(); int GetElement(int index); int GetSize(); private: int elements[size]; }; //Aggregate.cpp #include"Aggregate.h" #include"Iterator.h" Aggregate::Aggregate() { } Aggregate::~Aggregate() { } ConcreteAggregate::ConcreteAggregate() { for (int i = 0; i < size; i++) { elements[i] = i; } } ConcreteAggregate::~ConcreteAggregate() { } Iterator* ConcreteAggregate::NewConcreteIterator() { return new ConcreteIterator(this); } int ConcreteAggregate::GetElement(int index) { if (index < size) { return elements[index]; } return -1; } int ConcreteAggregate::GetSize() { return size; } //Iterator.h #pragma once class Aggregate; class Iterator { public: virtual ~Iterator(); virtual void First() = 0; virtual void Next() = 0; virtual bool IsDone() = 0; virtual int CurrentElement() = 0; protected: Iterator(); }; class ConcreteIterator :public Iterator { public: ConcreteIterator(Aggregate* aggregate, int index = 0); ~ConcreteIterator(); void First(); void Next(); bool IsDone(); int CurrentElement(); private: int index; Aggregate* aggregate; }; //Iterator.cpp #include"Iterator.h" #include"Aggregate.h" Iterator::Iterator() { } Iterator::~Iterator() { } ConcreteIterator::ConcreteIterator(Aggregate* aggregate, int index) { this->aggregate = aggregate; this->index = index; } ConcreteIterator::~ConcreteIterator() { } void ConcreteIterator::First() { this->index = 0; } void ConcreteIterator::Next() { if (index < aggregate->GetSize()) { index++; } } bool ConcreteIterator::IsDone() { return index == aggregate->GetSize(); } int ConcreteIterator::CurrentElement() { return aggregate->GetElement(index); } //Main.cpp #include"Aggregate.h" #include"Iterator.h" #include<iostream> using namespace std; int main() { Aggregate* aggregate = new ConcreteAggregate(); Iterator* iterator = new ConcreteIterator(aggregate); for (; !(iterator->IsDone()); iterator->Next()) { cout << iterator->CurrentElement() << endl; } delete iterator; delete aggregate; }
运行结果
下一篇:
c++在字符中删除指定字符串