有很多種方法可以把物件堆起來成為乙個集合(collection)。可以把它們放進陣列、堆疊、列表或是雜湊表(hashtable)中。如果想遍歷這些物件而且無法窺視儲存物件的方法,就需要迭代器模式。
迭代器模式(iterator pattern)提供了一種方法順序訪問乙個聚合物件中的各個元素,而不是暴露其內部的表示。集合(collection)是指一群物件,其儲存方式可以是各式各樣的資料結構,例如:列表、陣列等,有時候也被稱為聚合(aggregate)。uml圖如下:
● 迭代器角色(iterator):負責定義訪問和遍歷元素的介面。
● 具體迭代器角色(concrete iterator):實現迭代器的介面,並要記錄遍歷中的當前位置。
● 集合角色(aggregate):負責定義建立具體迭代器角色的介面。
● 具體集合角色(concrete aggregate):實現建立具體迭代器角色的介面
物件村的早餐店和午餐餐廳合併了,但是它們選單使用不同資料結構表示,早餐店使用列表,午餐廳使用陣列,如圖**所示。如何遍歷每份選單上的專案?
#include
#include
#include
using
namespace
std;
//選單項
class menuitem
menuitem(string name, string description, bool vegetarian, double price)
~menuitem()
string getname() const
string getdescripition() const
bool isvegetarian() const
double getprice() const
private:
string name_;
string description_;
bool vegetarian_;
double price_;
};//迭代器基類
class iterator
;//煎餅屋餐單迭代器
class pancakehousemenuiterator : public iterator
menuitem next()
bool hasnext()
else
}private:
list
items;
list
::const_iterator iter;
};//午餐店餐單迭代器
class dinermenuiterator : public iterator
menuitem next()
bool hasnext()
else
}private:
menuitem** items;
unsigned
int size_;
unsigned
int position;
};//餐單基類
class menu
};//煎餅屋選單
迭代器模式提供了一種方法,可以順序訪問乙個聚集物件中的元素,而又不用知道內部是如何表示的。另外,迭代器模式把元素之間遊走的責任交給迭代器,而不是聚合物件。這不僅讓聚合的介面和實現變得更簡潔,也可以讓聚合更專注在它所專注的事情上面,而不必去理會遍歷的事情。
設計模式之迭代器模式
概念 提供一種方法順序訪問乙個聚合物件中各個元素,而又不需暴露該物件的內部表示。main 客戶 iproject,產品介面 cproject,產品類 iiterator,迭代器介面 iprojectiterator,產品迭代器介面 cprojectiterator,產品迭代器實現類 說明 cproj...
設計模式之迭代器模式
當你需要訪問乙個聚集物件,而且不管這些物件是什麼都需要遍歷的時候,而且可能對聚集有多種方式遍歷時,需要為遍歷不同的聚集結構提供如開始,下乙個,是否結束,當前哪一項等 統一介面,你就應該考慮用迭代器模式.提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部表示.uml設計圖 部分 ite...
設計模式之迭代器模式
說起迭代器,大家一定不陌生,經常使用的foreach in 這種迴圈就是,c 語言已經內建化了迭代器模式,主要是支援對非泛型集合的簡單迭代介面ieumerator和公開列舉數ienumerable。雖然內建了,但是這種模式也有我們學習的必要性。如下 using system using system...