定义:迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
即不论对象内部的元素是以数组存放还是容器类型存放,都可以对外表现为迭代器形式。
#include <iostream> #include <string> #include <assert.h> using namespace std; class MenuItem { public: MenuItem(){} MenuItem( string &name, string& des, bool ck, float pric ); ~MenuItem(){} string& getItem() { return itemName; } string& getDes() { return description; } bool getCanCook() { return canCook; } float getPrice() { return price; } private: string itemName; string description; bool canCook; float price; }; MenuItem::MenuItem( string &name, string& des, bool ck, float pric ) { itemName = name; description = des; canCook = ck; price = pric; } class Iterator_MenuItem { public: Iterator_MenuItem(){} ~Iterator_MenuItem(){} virtual bool hasNext() = 0; virtual MenuItem* next() = 0; /* data */ }; #define MAX_ITEM 20 class PancakeHouseMenu : public Iterator_MenuItem { public: PancakeHouseMenu(); ~PancakeHouseMenu(){} bool hasNext(); MenuItem* next(); private: void addItem( string &name, string& des, bool ck, float pric ); private: MenuItem* item[MAX_ITEM]; int count; int iter; }; PancakeHouseMenu::PancakeHouseMenu() { count = 0; iter = 0; addItem( ( string )"K&B's Breakfast.", ( string )"Panckes with scrambled eggs.", true, 2.99f ); addItem( ( string )"Regular Pancake Breakfast.", ( string )"Panckes made with fresh blueberries.", false, 3.99f ); addItem( ( string )"Waffles.", ( string )"Waffles, with your choice of blueberries or strawberries.", true, 1.99f ); } void PancakeHouseMenu::addItem( string &name, string& des, bool ck, float pric ) { MenuItem *pMenuItem = new MenuItem( name, des, ck, pric ); item[count++] = pMenuItem; } bool PancakeHouseMenu::hasNext() { return iter < count ? true : false; } MenuItem* PancakeHouseMenu::next() { return item[iter++]; } void TestIteratorPattern() { PancakeHouseMenu pa; MenuItem* pTemp = NULL; assert( true == pa.hasNext() ); pTemp = pa.next(); assert( ( string )"K&B's Breakfast." == pTemp->getItem() ); assert( ( string )"Panckes with scrambled eggs." == pTemp->getDes() ); assert( true == pTemp->getCanCook() ); assert( 2.99f == pTemp->getPrice() ); assert( true == pa.hasNext() ); pTemp = pa.next(); assert( ( string )"Regular Pancake Breakfast." == pTemp->getItem() ); assert( ( string )"Panckes made with fresh blueberries." == pTemp->getDes() ); assert( false == pTemp->getCanCook() ); assert( 3.99f == pTemp->getPrice() ); assert( true == pa.hasNext() ); pTemp = pa.next(); assert( ( string )"Waffles." == pTemp->getItem() ); assert( ( string )"Waffles, with your choice of blueberries or strawberries." == pTemp->getDes() ); assert( true == pTemp->getCanCook() ); assert( 1.99f == pTemp->getPrice() ); } int main() { TestIteratorPattern(); return 0; }