首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 設計模式:迭代器模式詳解與 STL 風格實現

     編輯:關於C++

模式定義

迭代器模式:提供一種方法順序訪問聚合對象中的各個元素,而無需暴露該對象的內部表示。

核心角色

  • Iterator:定義訪問和遍歷元素的接口(first(), next(), currentItem(), isDone())。
  • ConcreteIterator:實現接口,維護當前遍歷位置。
  • Aggregate:定義創建迭代器的接口 createIterator()。
  • ConcreteAggregate:實現創建具體迭代器,並提供內部數據訪問(如 operator[], getLen())。

內部 vs 外部迭代器

  • 內部迭代器:遍歷邏輯封裝在聚合對象內部(如 forEach(callback)),耦合緊密,難以並發遍歷。
  • 外部迭代器:迭代器為獨立對象,客戶代碼控制遍歷流程,支持多個迭代器同時遍歷同一聚合,推薦使用。

STL 風格 C++ 實現

template 
class Iterator {
public:
    virtual void first() = 0;
    virtual void next() = 0;
    virtual Item* currentItem() = 0;
    virtual bool isDone() = 0;
    virtual ~Iterator() {}
};

template 
class ConcreteAggregate;

template 
class ConcreteIterator : public Iterator {
    ConcreteAggregate* aggr;
    int cur;
public:
    ConcreteIterator(ConcreteAggregate* a) : aggr(a), cur(0) {}
    void first() override { cur = 0; }
    void next() override { if (cur < aggr->getLen()) cur++; }
    Item* currentItem() override { return (cur < aggr->getLen()) ? &(*aggr)[cur] : nullptr; }
    bool isDone() override { return cur >= aggr->getLen(); }
};

template 
class Aggregate {
public:
    virtual Iterator* createIterator() = 0;
    virtual ~Aggregate() {}
};

template 
class ConcreteAggregate : public Aggregate {
    vector data;
public:
    ConcreteAggregate() { data = {1, 2, 3}; }
    Iterator* createIterator() override { return new ConcreteIterator(this); }
    Item& operator[](int index) { return data[index]; }
    int getLen() { return data.size(); }
};

// 使用
Aggregate* aggr = new ConcreteAggregate();
Iterator* it = aggr->createIterator();
for (it->first(); !it->isDone(); it->next())
    cout << *(it->currentItem()) << endl;

優勢

  • 分離遍歷邏輯與聚合結構,符合單一職責原則。
  • 支持多種遍歷策略(正序、逆序、過濾等)通過不同迭代器實現。
  • 不暴露內部數據結構(數組、鏈表、樹等)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved