C 設計模式 十五 迭代器模式

2021-07-07 09:36:55 字數 1837 閱讀 8256

對聚合類(如列表)的訪問和遍歷從列表物件中分離出來,並放入乙個迭代器物件中

迭代器定義了乙個訪問該列表元素的介面,迭代器負責跟蹤當前的元素,即知道哪些元素已經遍歷過了,如下圖所示:

iterator:定義迭代器訪問和遍歷元素的介面;

concreteiterator:實現具體的迭代器;

aggregate:定義的容器,建立相應迭代器物件的介面;

concreteaggregate:具體的容器實現建立相應迭代器的介面,該操作返回concreteiterator的乙個適當的例項。

然後aggregate中加入iterator的物件這樣就可以訪問容器的方法了實現遍歷。

1.迭代抽象:訪問乙個聚合物件的內容而無需暴露它的內部表示。

2.迭代多型:為遍歷不同的集合結構提供乙個統一的介面,從而支援同樣的演算法在不同的集合結構上進行操作。

3.迭代器的健壯性考慮:遍歷的同時更改迭代器所在的集合結構,會導致問題。

1.訪問乙個聚合物件的內容而無需暴露它的內部表示。 

2.支援對聚合物件的多種遍歷。 

3.為遍歷不同的聚合結構提供乙個統一的介面(即, 支援多型迭代)。

乙個簡單的實現:

#include"stdafx.h"

#include#include #include template class songsbook;

/*** 迭代器類宣告定義 ***/

template class iterator;};

template class ktvcrlor : public iterator

virtual item* first();

virtual item* next();

virtual item* currentitem();

virtual bool isdone();

private:

songsbook* songsbook;

int index;

};// --- 成員函式實現 ---

template item* ktvcrlor::first()

template item* ktvcrlor::next()

templateitem* ktvcrlor::currentitem()

template bool ktvcrlor::isdone()

/*** 聚類宣告定義 ***/

templateclass aggregate

; virtual iterator* createiterator() = 0;

virtual ~aggregate() {};

};templateclass songsbook : public aggregate;

void addsong(item* song);

int count();

virtual iterator* createiterator();

item* operator(int index);

private:

std::vectorsongs;

};// --- 成員函式實現 ---

templateint songsbook::count()

templatevoid songsbook::addsong(item* song)

templateiterator* songsbook::createiterator()

templateitem* songsbook::operator(int index)

int main()

system("pause");

}

設計模式(十五)迭代器模式

1 定義 提供乙個物件來順序訪問聚合物件中的一系列資料,而不暴露聚合物件的內部表示。是一種物件行為型模式。2 優缺點 優點封裝性好,為遍歷不同的聚合結構提供乙個統一的介面 訪問乙個聚合物件的內容而無須暴露它的內部表示 遍歷任務交由迭代器完成,這簡化聚合類 支援以不同方式遍歷乙個聚合,甚至可以自定義迭...

PHP設計模式系列(十五) 迭代器模式

提供一種方法順序訪問乙個聚合物件中的各個元素,而不是暴露其內部的表示。php spl中已經提供了迭代器介面iterator和容器介面iteatoraggragate,這裡直接實現spl的裡的迭代器。迭代器模式 concreteiterator 具體迭代器 class concreteiterator...

C 設計模式 迭代器模式

迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部表示。迭代器模式結構圖 iterator迭代器抽象類 class iterator public virtual object first 0 virtual object next 0 virtual ...