<Head First 设计模式>:迭代器模式1:Iterator
2015-04-29 23:07
453 查看
//今天一口气把这一章前半部分的iterator例子的所有代码写完,涉及到了不少指针的内容,竟然一次性编译通过。。。。
//Iterator与Menu之间应该不是has a的关系,先这样着吧。
//Iterator与Menu之间应该不是has a的关系,先这样着吧。
#ifndef __MENUITEM_H__ #define __MENUITEM_H__ #include <string> #include <vector> #include <iostream> using namespace std; class MenuItem { private: string name; string description; bool vegetarian; double price; public: MenuItem(){} MenuItem(const string &na, const string des, bool vege, double pr) { name = na; description = des; vegetarian = vege; price = pr; } virtual ~MenuItem(){} string getName(){ return name; } string getDescription(){ return description; } double getPrice(){ return price; } bool isVegetarian(){ return vegetarian; } }; #endif
#ifndef __ITERATOR_H__ #define __ITERATOR_H__ #include "MenuItem.h" class Iterator { public: Iterator(){} virtual ~Iterator(){} virtual bool hasNext() = 0; virtual MenuItem* next() = 0; }; class DinerIterator : public Iterator { private: MenuItem ** menuItem; int position; int length; public: DinerIterator(MenuItem **m, int le) :menuItem(m), length(le), position(0){} virtual ~DinerIterator(){} virtual MenuItem* next() { MenuItem *p = menuItem[position]; position++; return p; } virtual bool hasNext() { if (position >= length || menuItem[position] == NULL) { return false; } return true; } }; class PancakeIterator : public Iterator { private: vector<MenuItem*> menuItem; int position; int length; public: PancakeIterator(vector<MenuItem*> &m) :position(0), length(m.size()) { menuItem = m; } virtual ~PancakeIterator(){} virtual MenuItem* next() { MenuItem *p = menuItem[position]; position++; return p; } virtual bool hasNext() { if (position >= length || menuItem[position] == NULL) { return false; } return true; } }; #endif
#ifndef __MENU_H__ #define __MENU_H__ #include "Iterator.h" class Menu { public: Menu(){} virtual ~Menu(){} virtual Iterator * CreateIterator()= 0; }; class PackageHouseMenu :public Menu { private: vector<MenuItem*> menuItem; public: PackageHouseMenu() { addItem("PancakeMunu: BlueBerry Pancakes", "Pancakes made with fresh blueberries", true, 3.49); addItem("PancakeMunu: Waffles", "Waffles, with your choice of blueberries or strawberries", true, 3.59); } ~PackageHouseMenu() { if (!menuItem.empty()) { for (size_t i = 0; i < menuItem.size(); i++) { delete menuItem[i]; } menuItem.clear(); } } void addItem(const string na, const string des, bool vege, double pr) { MenuItem *t = new MenuItem(na, des, vege, pr); menuItem.push_back(t); } vector<MenuItem*> getMenuItem(){ return menuItem; } Iterator *CreateIterator() { Iterator *iter = new PancakeIterator(menuItem); return iter; } }; class DinerMenu :public Menu { private: static const int MAXITEMS = 6; int numberOfItems; MenuItem * menuItem[MAXITEMS]; public: DinerMenu() { numberOfItems = 0; for (int i = 0; i < MAXITEMS; i++) { menuItem[i] = NULL; } addItem("DinerMenu: Hot dog", "a hot dog,with sauerkraut, relish, onions", false, 3.05); addItem("DinerMenu: BLT", "Bacon with lettuce & tomato on whole wheat", false, 2.99); } ~DinerMenu() { if (numberOfItems != 0) { for (int i = 0; i < numberOfItems + 1; i++) { delete menuItem[i]; } } } void addItem(const string na, const string des, bool vege, double pr) { if (numberOfItems > MAXITEMS) { cout << "Error, Can't Add More!" << endl; } else { MenuItem *p = new MenuItem(na, des, vege, pr); menuItem[numberOfItems] = p; numberOfItems++; } } MenuItem** getMenuItems() { return menuItem; } Iterator *CreateIterator() { Iterator *iter = new DinerIterator(menuItem, numberOfItems + 1); return iter; } }; #endif
#ifndef __WAITRESS_H__ #define __WAITRESS_H__ #include "Menu.h" class Waitress { private: Menu *panckage; Menu *diner; public: Waitress(Menu *p, Menu *d) { panckage = p; diner = d; } ~Waitress() { } void printMenu(Iterator *it) { while (it->hasNext()) { MenuItem *p = it->next(); cout << p->getName() << ", " << p->getDescription() << "," << p->getPrice() << endl; } } void printMenu() { Iterator* pan = panckage->CreateIterator(); Iterator* din = diner->CreateIterator(); printMenu(pan); printMenu(din); } }; #endif
#include <iostream> #include "Waitress.h" using namespace std; int main() { PackageHouseMenu *p = new PackageHouseMenu(); DinerMenu *d = new DinerMenu(); Waitress *w = new Waitress(p, d); w->printMenu(); delete w; delete p; delete d; return 0; }
相关文章推荐
- (Boolan)C++设计模式 <十一> ——组合模式(Composite)、迭代器(Iterator)和责任链(Chain of Resposibility)
- 浅学设计模式之迭代器<Iterator>模式
- 浅学设计模式之迭代器<Iterator>模式
- <Head First 设计模式>:工厂模式1:方法模式--Pizza
- <Head First 设计模式>:单件模式:Singleton
- JAVA设计模式(16) —<行为型>迭代子模式(Iterator)
- 浅学设计模式之迭代器<Iterator>模式
- <Head First 设计模式>:装饰者模式--Beverage
- 我的<<Head First 设计模式>>读后感整理
- <Head First 设计模式>:适配器模式:Adapter
- 设计模式-迭代器模式(iterator pattern)
- <Java设计模式>---单一职责原则
- 设计模式 - Iterator 模式(迭代器模式)
- 设计模式总结笔记<二> 工厂模式
- 黑马程序员_<<装饰设计模式>>
- java设计模式---迭代器模式(iterator pattern)
- 设计模式之迭代器模式(Iterator)
- .NET设计模式(18):迭代器模式(Iterator Pattern)
- OpenCV 2 学习笔记(12): 算法的基本设计模式<3>:单例模式(Singleton pattern)
- 设计模式_Iterator_迭代器模式