利用相同介面可以遍歷不同集合(聚集),且不暴露集合內部的元素。
書中的例子:a餐廳和b餐廳合併,他們的選單擁有不同的儲存方法,如a餐廳用陣列array,而b餐廳用list。這樣帶來的問題是在列印選單項的時候需要分別遍歷他們各種的選單,這樣處理不僅麻煩,而且不利於擴充套件,當有更多的餐廳被合併的時候,會帶來更多的**修改。如果是將各個餐廳的選單改為同一種容器來存放,這樣帶來的改動過大。所以結合各種利弊,這裡採取的解決方法是將各自選單的遍歷方式統一化。
1. 基本實現
class waiter
;waiter::waiter(menua *a, menub *b)
void waiter::printmenu()
void client::printmenu(iterator *it)
}
client:
menua *pmenua = new menua();
menub *pmenub = new menub();
waiter *pwaiter = new waiter(pmenua, pmenub);
pwaiter->printmenu();
2. 更近一步
按照上面的方法,對於選單很多的情況下,writer就要建立更多的迭代器,並分別printmenu。解決多個選單更好的解決方法是在選單的外層巢狀乙個迭代器,所以先將各個選單放入乙個容器中,並為這個容器定義迭代器,在列印選單的時候利用這個迭代器遍歷容器。
class waiter
void printmenus();
void printmenus(iterartor *it);
public:
arraymenus *m_menus; // 存放選單
};void waiter::printmenus()
}void waiter::printmenus(iterartor *it)
}
client:
arraymenus *pmenus = new arraymenus();
menua *pmenua = new menua();
menub *pmenub = new menub();
pmenus->add(pmenua);
pmenus->add(pmenub);
waiter *pwaiter = new waiter(pmenus);
pwaiter->printmenu();
11 迭代器模式
乙個迭代器的實現,必須繼承 spl 中的迭代器介面 iterator class alluser implements iterator 對於乙個迭代器來說,有5個方法必須實現 重置整個迭代器,回到整個集合的開頭 public function rewind 驗證當前是否還有下乙個元素 public...
迭代器模式
迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中各個元素,而不是暴露該物件的內部表示。乙個聚集物件,而且不管這些物件是什麼都需要遍歷的時候,你就應該考慮用迭代器模式。你需要對聚集有多種方式遍歷時,可以考慮用迭代器模式。為遍歷不同的聚集結構提供如開始,下乙個,是否結束,當前哪一項等統一...
迭代器模式
我最早接觸的設計模式就是迭代器模式了哈 為什麼要有迭代器模式呢?看下下面的 就知道了哈 對於乙個陣列物件sz 我們要怎麼遍歷呢?public void bianlisz class geweishu public myiterator getiterator private class geweis...