提供一種方法順序訪問一個聚合物件中各個元素,而又不需暴露該物件的內部表示。

Iterator 是多數 C++ 開發者接觸的第一個設計模式(STL 容器皆內建迭代器)。其精髓在於:
value_type, pointer, reference, ++, ==, * 等),使演算法能通用於任何符合規範的容器。CreateIterator()。演算法不關心容器底層是陣列、鏈表還是樹。Iterator*,執行期綁定具體迭代器,實現「演算法與容器獨立變化」。#ifndef ITERATOR_H
#define ITERATOR_H
typedef int DATA;
class Iterator;
class Aggregate;
// 聚合抽象基類
class Aggregate {
public:
virtual ~Aggregate() {}
virtual Iterator* CreateIterator(Aggregate* pAggregate) = 0;
virtual int GetSize() = 0;
virtual DATA GetItem(int nIndex) = 0;
};
// 迭代器抽象基類(規範介面)
class Iterator {
public:
virtual ~Iterator() {}
virtual void First() = 0;
virtual void Next() = 0;
virtual bool IsDone() = 0;
virtual DATA CurrentItem() = 0;
};
// 具體聚合:陣列實作
class ConcreteAggregate : public Aggregate {
public:
ConcreteAggregate(int nSize);
virtual ~ConcreteAggregate();
virtual Iterator* CreateIterator(Aggregate* pAggregate);
virtual int GetSize();
virtual DATA GetItem(int nIndex);
private:
int m_nSize;
DATA* m_pData;
};
// 具體迭代器:遍歷 ConcreteAggregate
class ConcreteIterator : public Iterator {
public:
ConcreteIterator(Aggregate* pAggregate);
virtual ~ConcreteIterator() {}
virtual void First();
virtual void Next();
virtual bool IsDone();
virtual DATA CurrentItem();
private:
Aggregate* m_pConcreteAggregate;
int m_nIndex;
};
#endif
#include <iostream>
#include "Iterator.h"
ConcreteAggregate::ConcreteAggregate(int nSize) : m_nSize(nSize), m_pData(nullptr) {
m_pData = new DATA[m_nSize];
for (int i = 0; i < nSize; ++i) m_pData[i] = i;
}
ConcreteAggregate::~ConcreteAggregate() {
delete[] m_pData; m_pData = nullptr;
}
Iterator* ConcreteAggregate::CreateIterator(Aggregate* pAggregate) {
return new ConcreteIterator(this);
}
int ConcreteAggregate::GetSize() { return m_nSize; }
DATA ConcreteAggregate::GetItem(int nIndex) {
return (nIndex < m_nSize) ? m_pData[nIndex] : -1;
}
ConcreteIterator::ConcreteIterator(Aggregate* pAggregate) : m_pConcreteAggregate(pAggregate), m_nIndex(0) {}
void ConcreteIterator::First() { m_nIndex = 0; }
void ConcreteIterator::Next() {
if (m_nIndex < m_pConcreteAggregate->GetSize()) ++m_nIndex;
}
bool ConcreteIterator::IsDone() {
return m_nIndex == m_pConcreteAggregate->GetSize();
}
DATA ConcreteIterator::CurrentItem() {
return m_pConcreteAggregate->GetItem(m_nIndex);
}
#include "Iterator.h"
#include <iostream>
int main() {
Aggregate* pAggregate = new ConcreteAggregate(4);
Iterator* pIterator = new ConcreteIterator(pAggregate);
for (; !pIterator->IsDone(); pIterator->Next())
std::cout << pIterator->CurrentItem() << std::endl; // 輸出 0 1 2 3
delete pIterator;
delete pAggregate;
return 0;
}
C++11 起,範圍ベース for 循環(for (auto& x : container))隱式使用 begin()/end(),本質仍是 Iterator 模式。自製容器只需提供符合標準的迭代器型別,即可無縫融入 STL 生態。