這個設計模式感覺非常簡單,我們平時寫程序的時候也是經常需要調用iterator的,C++和Java都是。
所以感覺沒什麼特別的,就是需要模仿C++或者Java的iterator類的功能吧。
這裡簡單寫個,使用C++模仿Java的iterator一些功能,呵呵。
首先我們有一個集合類,而這個集合類包含了其他類,當我們需要遍歷這個集合類包含的類的時候,就好使用iterator功能了。
比如有一個原始的類:
class SalesPerson { private: string name; string division; public: explicit SalesPerson(string n = "", string d = "") : name(n), division(d) {} string getName() { return name; } void print() { printf("SalesPerson %s is in %s department.\n", name.c_str(), division.c_str()); } };
class Division { private: string name; SalesPerson **sales; int number; DivisionIterator *dit; int Len; public: Division(string n) : name(n), Len(100), number(0), dit(NULL) { sales = new SalesPerson*[Len]; for (int i = 0; i < Len; i++) { sales[i] = NULL; } } ~Division() { for (int i = 0; i <= number; i++) { delete sales[i]; } if (sales) delete [] sales; if (dit) delete dit; } string getName() { return name; } void add(string n) { sales[number++] = new SalesPerson(n, name); } DivisionIterator *iterator() { if (!dit) dit = new DivisionIterator(sales); return dit; } };
class DivisionIterator { private: SalesPerson **sales; int location; int Len; public: DivisionIterator(SalesPerson **v) : sales(v), location(0), Len(100) { } SalesPerson *next() { return sales[location++]; } bool hasNext() { if (location < Len && sales[location]) return true; return false; } void remove() //暫時空功能 { } };
void salesIteratorTest() { Division divs("SalesDep"); divs.add("Sally"); divs.add("Jelly"); divs.add("Lily"); divs.add("Billy"); divs.add("Cherry"); DivisionIterator *it = divs.iterator(); while (it->hasNext()) { SalesPerson *sa = it->next(); sa->print(); } }
遍歷功能是沒問題的,這個設計模式運用成功,很簡單。
不過最郁悶的不是這個設計模式,而是Flyweight設計模式,感覺就是一個簡單的功能函數也歸結為一個設計模式,也許我學的還不是很透切吧。
總體來說設計模式還是很有用的,目前正在運用設計模式寫框架呢,寫成了拿出來show show。或者做成開源項目了。