iterator.h

 #ifndef _ITERATOR_H_
#define _ITERATOR_H_ #include "menu_item.h" class Iterator {
public:
virtual bool has_next() = ;
virtual MenuItem *next() = ;
};
#endif

menu_item.h

 #ifndef _MENU_ITEM_H_
#define _MENU_ITEM_H_ #include <string> class MenuItem {
private:
std::string name;
std::string description;
bool vegetarian;
double price;
public:
MenuItem( const std::string &_name,
const std::string _description,
bool _vegetarian,
double _price) :
name(_name),
description(_description),
vegetarian(_vegetarian),
price(_price) {} std::string get_name() { return name; }
std::string get_description() { return description; }
double get_price() { return price; }
bool is_vegetarian() { return vegetarian; }
};
#endif

pancake_house_menu.h

 #ifndef _PANCAKE_HOUSE_MENU_H_
#define _PANCAKE_HOUSE_MENU_H_ #include "menu_item.h"
#include "iterator.h" class PancakeHouseMenu {
public:
void add_item(const std::string& name,
const std::string& description,
bool vegetarian,
double price) {
if ( item_num < MAX_ITEMS ) {
menu_items[item_num++] = new MenuItem( name, description, vegetarian, price );
}
} PancakeHouseMenu() : item_num(), iterator(*this) {
add_item("name_1", "descrption_1", true, 4.5);
add_item("name_2", "descrption_2", true, 6.2);
add_item("name_3", "descrption_3", false, 3.5);
} ~PancakeHouseMenu() {
for ( int i = ; i < item_num; i++ ) {
delete menu_items[i];
}
} Iterator *get_iterator() {
return &iterator;
} private:
class _Iterator : public Iterator {
private:
PancakeHouseMenu &menu;
int pos;
public:
_Iterator( PancakeHouseMenu &_menu) : pos(), menu(_menu) {}
bool has_next() { return pos < menu.item_num; }
MenuItem *next() {
return menu.menu_items[pos++];
}
} iterator; const static int MAX_ITEMS = ;
MenuItem *menu_items[MAX_ITEMS];
int item_num;
};
#endif

main.cpp

 #include "pancake_house_menu.h"
#include <iostream> int main() {
PancakeHouseMenu menu;
Iterator *iterator = menu.get_iterator();
while ( iterator->has_next() ) {
MenuItem *menu_item = iterator->next();
std::cout << menu_item->get_name() << " "
<< menu_item->get_description() << " "
<< menu_item->is_vegetarian() << " "
<< menu_item->get_price() << std::endl;
}
}

Headfirst设计模式的C++实现——迭代器(Iterator)的更多相关文章

  1. Headfirst设计模式的C++实现——迭代器(Iterator)改良版

    iterator.h #ifndef _ITERATOR_H_ #define _ITERATOR_H_ class Iterator { public: ; ; }; #endif menu.h # ...

  2. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---迭代器模式之DinerMenu[转]

    容器的主要职责有两个:存放元素和浏览元素.根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器. 用迭代器封装对动态数组的遍历:  1  2{<HeadFirst设计模式& ...

  3. 设计模式C++描述----20.迭代器(Iterator)模式

    一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...

  4. C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模 ...

  5. C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看.“迭代器模式”我第一次看到这个名称,我的理解 ...

  6. 【设计模式 - 16】之迭代器模式(Iterator)

    1      模式简介 迭代器模式是JAVA中非常常用的模式,List.Map.Set等常见集合中都封装了迭代器Iterator. 迭代器模式的介绍: 迭代器模式用于顺序访问集合对象中的元素,而不需要 ...

  7. 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

    迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...

  8. 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释

    组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...

  9. Javascript设计模式之我见:迭代器模式

    大家好!本文介绍迭代器模式及其在Javascript中的应用. 模式介绍 定义 提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 类图及说明 Iterator抽象迭代器 抽象迭代器负 ...

随机推荐

  1. POJ 2778 DNA Sequence (AC自己主动机 + dp)

    DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...

  2. html5非常火,他究竟与html4有何差别?

    HTML5是HTML标准的下一个版本号.越来越多的程序猿開始HTML5来构建站点.假设你同一时候使用HTML4和HTML5的话 ,你会发现用HTML5从头构建.比从HTML4迁移到HTML5要方便非常 ...

  3. [RxJS] just, return

    Sometime, we migth just want to return a object which wrap into Observable. You can use 'just' or  ' ...

  4. [Practical Git] Configure global settings with git config

    You can set up global "git config" settings that apply to all git projects on your system. ...

  5. 假设有两个包含整数的vector对象,编写一段程序,检验其中一个vector对象是否是另一个的前缀。

    #include<iostream> #include<string> #include<vector> using namespace std; int main ...

  6. android studio的里的 content_XXX_xml问题

    遇到这个问题就是androidStudio的版本问题,androidStudio会出现这个问题是在androidStudio1.4以上版本当遇到这个问题的时候建Activity的时候选择EmptyAc ...

  7. chrome,firefox

    chrome开发者工具 firefox插件httpfox

  8. lshw 命令(查看硬件信息)

    帮助 $ lshw -h Hardware Lister (lshw) - B.02.16 usage: lshw [-format] [-options ...] lshw -version -ve ...

  9. Entity Framework 学习整理(分播客整理)

    MSDN: http://msdn.microsoft.com/en-us/data/aa937723 台湾博客: http://www.dotblogs.com.tw/yc421206/ http: ...

  10. JNDI初认识

    JNDI即Java命名和目录接口,英文全称为Java Naming and Directory Interface,从字面上似乎十分晦涩,下面从理论和实际项目应用方面来阐述. 1.命名:在我们实际生活 ...