設計模式之迭代器模式

2021-08-07 03:43:40 字數 3196 閱讀 2283

有很多種方法可以把物件堆起來成為乙個集合(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...