Headfirst设计模式的C++实现——迭代器(Iterator)
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)的更多相关文章
- Headfirst设计模式的C++实现——迭代器(Iterator)改良版
iterator.h #ifndef _ITERATOR_H_ #define _ITERATOR_H_ class Iterator { public: ; ; }; #endif menu.h # ...
- 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 ...
- Javascript设计模式之我见:迭代器模式
大家好!本文介绍迭代器模式及其在Javascript中的应用. 模式介绍 定义 提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 类图及说明 Iterator抽象迭代器 抽象迭代器负 ...
随机推荐
- 【转】Netty那点事(三)Channel中的Pipeline
[原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch3-pipeline.md Channel是理解和使用Nett ...
- Java DESede用C++ Openssl实现
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- cocos2d-x与ios内存管理分析(在游戏中减少内存压力)
转自:http://www.cocos2dev.com/?p=281 注:自己以前也写过cocos2d-x如何优化内存的使用,以及内存不足的情况下怎么处理游戏.今天在微博中看到有朋友介绍了下内存,挺详 ...
- 安装builderRobot到Rational Functional Tester和Performance Tester
最近研究安装builder,稍微总结一下,以后继续补充: 1. Robot采用专业的测试脚本语言, 从而导致需要学习专门的API以及专门的语法外, 用进程化的Visual Basic作为脚本语言, 导 ...
- C++中的头文件和源文件
一.C++编译模式 通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是C ...
- c数组和指针的理解
#include<stdio.h> int main(void) { ,,,,}; ); printf(,*(p-)); // ] = &a; √ // ] = a; × // ] ...
- NUMA CPU optimization
technologies: OS, CPU cache, numa structure, memory access
- copy与deepcopy
对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 对于字典.元祖.列表 而言,进行赋值.浅拷贝和深拷贝时,其内存地址的变化是不同的. 赋值,只是创建一个变量,该 ...
- Guzzle Unable to parse JSON data: JSON_ERROR_SYNTAX - Syntax error, malformed JSON
项目更新到正式平台时,出现Guzzle(5.3) client get请求出现:Unable to parse JSON data: JSON_ERROR_SYNTAX - Syntax error, ...
- fiddlercore 抓包获取cookie的方法
public partial class form1 : Form { public form1() { string cookies = ""; InitializeCompon ...