Headfirst设计模式的C++实现——迭代器(Iterator)改良版
Posted Ren.Yu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Headfirst设计模式的C++实现——迭代器(Iterator)改良版相关的知识,希望对你有一定的参考价值。
iterator.h
1 #ifndef _ITERATOR_H_ 2 #define _ITERATOR_H_ 3 4 class Iterator { 5 public: 6 virtual bool has_next() = 0; 7 virtual void *next() = 0; 8 }; 9 #endif
menu.h
1 #ifndef _MENU_H_ 2 #define _MENU_H_ 3 4 class Menu { 5 public: 6 virtual Iterator *get_iterator() = 0; 7 virtual ~Menu() {}; 8 }; 9 #endif
diner_menu.h
1 #ifndef _DINER_MENU_H_ 2 #define _DINER_MENU_H_ 3 4 #include "menu_item.h" 5 #include "iterator.h" 6 #include <vector> 7 #include "menu.h" 8 9 class DinerMenu : public Menu { 10 public: 11 void add_item(const std::string& name, 12 const std::string& description, 13 bool vegetarian, 14 double price) { 15 menu_items.push_back( MenuItem(name, description, vegetarian, price) ); 16 } 17 18 DinerMenu() : iterator( *this ) { 19 add_item("diner name_1", "descrption_1", true, 4.5); 20 add_item("diner name_2", "descrption_2", true, 6.2); 21 add_item("diner name_3", "descrption_3", false, 3.5); 22 } 23 24 Iterator *get_iterator() { 25 return &iterator; 26 } 27 private: 28 class _Iterator : public Iterator { 29 private: 30 DinerMenu &menu; 31 int pos; 32 public: 33 _Iterator( DinerMenu &_menu) : pos(0), menu(_menu) {} 34 bool has_next() { return pos < menu.menu_items.size(); } 35 void* next() { 36 return &(menu.menu_items[pos++]); 37 } 38 } iterator; 39 40 std::vector<MenuItem> menu_items; 41 }; 42 #endif
pancake_house_menu.h
1 #ifndef _PANCAKE_HOUSE_MENU_H_ 2 #define _PANCAKE_HOUSE_MENU_H_ 3 4 #include "menu_item.h" 5 #include "iterator.h" 6 #include "menu.h" 7 8 class PancakeHouseMenu : public Menu { 9 public: 10 void add_item(const std::string& name, 11 const std::string& description, 12 bool vegetarian, 13 double price) { 14 if ( item_num < MAX_ITEMS ) { 15 menu_items[item_num++] = new MenuItem( name, description, vegetarian, price ); 16 } 17 } 18 19 PancakeHouseMenu() : item_num(0), iterator(*this) { 20 add_item("name_1", "descrption_1", true, 4.5); 21 add_item("name_2", "descrption_2", true, 6.2); 22 add_item("name_3", "descrption_3", false, 3.5); 23 } 24 25 ~PancakeHouseMenu() { 26 for ( int i = 0; i < item_num; i++ ) { 27 delete menu_items[i]; 28 } 29 } 30 31 Iterator *get_iterator() { 32 return &iterator; 33 } 34 35 private: 36 class _Iterator : public Iterator { 37 private: 38 PancakeHouseMenu &menu; 39 int pos; 40 public: 41 _Iterator( PancakeHouseMenu &_menu) : pos(0), menu(_menu) {} 42 bool has_next() { return pos < menu.item_num; } 43 void* next() { 44 return menu.menu_items[pos++]; 45 } 46 } iterator; 47 48 const static int MAX_ITEMS = 6; 49 MenuItem *menu_items[MAX_ITEMS]; 50 int item_num; 51 }; 52 #endif
main.cpp
1 #include "pancake_house_menu.h" 2 #include "diner_menu.h" 3 #include <iostream> 4 5 int main() { 6 Menu * menus[] = { new PancakeHouseMenu, new DinerMenu }; 7 for ( int i = 0; i < sizeof(menus)/sizeof(menus[0]); i++ ) { 8 Iterator *iterator = menus[i]->get_iterator(); 9 while ( iterator->has_next() ) { 10 MenuItem *menu_item = (MenuItem *)iterator->next(); 11 std::cout << menu_item->get_name() << " " 12 << menu_item->get_description() << " " 13 << menu_item->is_vegetarian() << " " 14 << menu_item->get_price() << std::endl; 15 } 16 delete menus[i]; 17 } 18 }
以上是关于Headfirst设计模式的C++实现——迭代器(Iterator)改良版的主要内容,如果未能解决你的问题,请参考以下文章