Headfirst设计模式的C++实现——迭代器(Iterator)改良版
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)改良版的更多相关文章
- Headfirst设计模式的C++实现——迭代器(Iterator)
iterator.h #ifndef _ITERATOR_H_ #define _ITERATOR_H_ #include "menu_item.h" class Iterator ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---迭代器模式之DinerMenu[转]
容器的主要职责有两个:存放元素和浏览元素.根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器. 用迭代器封装对动态数组的遍历: 1 2{<HeadFirst设计模式& ...
- 设计模式C++描述----20.迭代器(Iterator)模式
一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...
- C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模 ...
- C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看.“迭代器模式”我第一次看到这个名称,我的理解 ...
- 【设计模式 - 16】之迭代器模式(Iterator)
1 模式简介 迭代器模式是JAVA中非常常用的模式,List.Map.Set等常见集合中都封装了迭代器Iterator. 迭代器模式的介绍: 迭代器模式用于顺序访问集合对象中的元素,而不需要 ...
- 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...
- 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释
组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...
- 《Head first设计模式》学习笔记 – 迭代器模式
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...
随机推荐
- android studio里的build.gradle基本属性
//声明是android 程序 apply plugin: 'com.android.application' android { //编译SDK版本 compileSdkVersion 23 // ...
- 【M13】以by reference 方式捕捉exceptions
1.catch语句的参数有三种方式:by pointer,by value,by reference. 2.首先考虑,by pointer.这意味着抛出端必须抛出一个对象的地址.那么问题来了: 如果这 ...
- jquery html标签的链式语法
<div id="ProductNet"> <table border='0' cellspacing='2' cellpadding='0' style='te ...
- starling localToGlobal
o.localToGlobal(new Point()); 返回o在舞台的全局坐标... o.parent.localToGlobal(new Point(o.x,o.y)) //返回指定坐标 ...
- img图片下有个间隙是为什么
转自知乎:http://www.zhihu.com/question/21558138要理解这个问题,首先要弄明白CSS对于 display: inline 元素的 vertical-align 各个 ...
- 文件I/O(不带缓冲)之原子操作
一.添写至一个文件 考虑一个进程,它要将数据添加到一个文件尾端.早期的UNIX系统并不支持open的O_APPEND选项,所以程序被编写成下列形式: ) < ) /* position to E ...
- java RSA加密解密--转载
原文地址:http://www.blogjava.net/icewee/archive/2012/05/19/378570.html 该工具类中用到了BASE64,需要借助第三方类库:javabase ...
- iOS 开发中你是否遇到这些经验问题(二)
前言: 1.在Block中一起使用weakSelf与strongSelf的含义 我们都会声明一个弱引用在block中使用, 目的就是防止循环引用, 那么weakSelf与strongSelf一起使用目 ...
- MySql安装步骤详解,MySql的root密码设置,启动MySql服务。
1.下载mysql安装包,并解压,双击mysql-5.6.24-winx64.msi 2.点击下一步 3.选择custom 4.选择安装内容和位置,5个安装内容要选择will be installed ...
- JavaScript总结3—对象
对象是JavaScript的基本类型,他可以从一个称为原型的对象继承属性,这种原型式继承是JavaScript的核心特征.对对象比较常见的操作有:创建,设置,查找,删除,检测和枚举他的属性.每个对象都 ...