iterator.h

 #ifndef _ITERATOR_H_
#define _ITERATOR_H_ class Iterator {
public:
virtual bool has_next() = ;
virtual void *next() = ;
};
#endif

menu.h

 #ifndef _MENU_H_
#define _MENU_H_ class Menu {
public:
virtual Iterator *get_iterator() = ;
virtual ~Menu() {};
};
#endif

diner_menu.h

 #ifndef _DINER_MENU_H_
#define _DINER_MENU_H_ #include "menu_item.h"
#include "iterator.h"
#include <vector>
#include "menu.h" class DinerMenu : public Menu {
public:
void add_item(const std::string& name,
const std::string& description,
bool vegetarian,
double price) {
menu_items.push_back( MenuItem(name, description, vegetarian, price) );
} DinerMenu() : iterator( *this ) {
add_item("diner name_1", "descrption_1", true, 4.5);
add_item("diner name_2", "descrption_2", true, 6.2);
add_item("diner name_3", "descrption_3", false, 3.5);
} Iterator *get_iterator() {
return &iterator;
}
private:
class _Iterator : public Iterator {
private:
DinerMenu &menu;
int pos;
public:
_Iterator( DinerMenu &_menu) : pos(), menu(_menu) {}
bool has_next() { return pos < menu.menu_items.size(); }
void* next() {
return &(menu.menu_items[pos++]);
}
} iterator; std::vector<MenuItem> menu_items;
};
#endif

pancake_house_menu.h

 #ifndef _PANCAKE_HOUSE_MENU_H_
#define _PANCAKE_HOUSE_MENU_H_ #include "menu_item.h"
#include "iterator.h"
#include "menu.h" class PancakeHouseMenu : public Menu {
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; }
void* 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 "diner_menu.h"
#include <iostream> int main() {
Menu * menus[] = { new PancakeHouseMenu, new DinerMenu };
for ( int i = ; i < sizeof(menus)/sizeof(menus[]); i++ ) {
Iterator *iterator = menus[i]->get_iterator();
while ( iterator->has_next() ) {
MenuItem *menu_item = (MenuItem *)iterator->next();
std::cout << menu_item->get_name() << " "
<< menu_item->get_description() << " "
<< menu_item->is_vegetarian() << " "
<< menu_item->get_price() << std::endl;
}
delete menus[i];
}
}

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

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

    iterator.h #ifndef _ITERATOR_H_ #define _ITERATOR_H_ #include "menu_item.h" class Iterator ...

  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. 《Head first设计模式》学习笔记 – 迭代器模式

    <Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...

随机推荐

  1. 如何用 iptables 禁止某个ip?

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  2. AS问题解决系列1—Unable to execute DX错误

    http://my.oschina.net/1pei/blog/478968 摘要 在将一个开源Android代码import到Android Studio 1.2.2中时,解决了编译期间出现的“Un ...

  3. Project Management - 3) Manage Your Meetings

    1. 取消没有价值的会议 会议是有代价和成本的 不要举行顺序式的多人进度报告会议 eg: 这周做了什么,下周还要做什么? 除了发言人和项目经理外,每个人都会觉得无聊. 这种会议是在拖项目的后腿,赶紧停 ...

  4. navicat for mysql (10038)如何解决,远程无法连接问题

    ubuntu server下安装了MySQL 5.5数据库,然后在windows下通过Navicat for MySQL连接时,出现 Can't connect to mysql server on ...

  5. protocol buffer的简单使用

    protocol buffer是一个高效的结构化数据存储格式,用来结构化数据的序列化与反序列化.目前支持java.c++.Python 相对于json而言: 数据量跟小 其他的还没看出什么优势 下载地 ...

  6. typedef和typename关键字

    .类型说明typedef 类型说明的格式为: typedef 类型 定义名; 类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型.定义名表示这个类型的新名字. 例如: 用下面语句定义整型数 ...

  7. 八、套接字(Socket)

    demo 一个连接由它的两个端点标识,这样的端点称为套接 套接字是支持TCP/IP协议的网络通信的基本操作单元. 可以将套接字看作不同主机间的进程进行双向通信的端点. 上图连接1的一对套接字为: (1 ...

  8. c#_DropdownList Panel Textbox 控件交互使用,有autopostback和没有的区别

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  9. js代码 设为首页 加入收藏

    // JavaScript Document // 加入收藏 <a onclick="AddFavorite(window.location,document.title)" ...

  10. 关于jQuery对象与DOM对象

    今天遇到了关于jQuery对象与dom对象的区分问题.具体如下:对于元素<span id="aa" class="aa">hyz</span& ...