//今天一口气把这一章前半部分的iterator例子的所有代码写完,涉及到了不少指针的内容,竟然一次性编译通过。。。。

//Iterator与Menu之间应该不是has a的关系,先这样着吧。

#ifndef __MENUITEM_H__
#define __MENUITEM_H__
#include <string>
#include <vector>
#include <iostream>
using namespace std;
class MenuItem
{
private:
string name;
string description;
bool vegetarian;
double price;
public:
MenuItem(){}
MenuItem(const string &na, const string des, bool vege, double pr)
{
name = na;
description = des;
vegetarian = vege;
price = pr;
}
virtual ~MenuItem(){}
string getName(){ return name; }
string getDescription(){ return description; }
double getPrice(){ return price; }
bool isVegetarian(){ return vegetarian; } }; #endif
#ifndef __ITERATOR_H__
#define __ITERATOR_H__
#include "MenuItem.h"
class Iterator
{
public:
Iterator(){}
virtual ~Iterator(){}
virtual bool hasNext() = 0;
virtual MenuItem* next() = 0;
}; class DinerIterator : public Iterator
{
private:
MenuItem ** menuItem;
int position;
int length;
public:
DinerIterator(MenuItem **m, int le) :menuItem(m), length(le), position(0){}
virtual ~DinerIterator(){}
virtual MenuItem* next()
{
MenuItem *p = menuItem[position];
position++;
return p;
} virtual bool hasNext()
{
if (position >= length || menuItem[position] == NULL)
{
return false;
}
return true;
}
}; class PancakeIterator : public Iterator
{
private:
vector<MenuItem*> menuItem;
int position;
int length;
public:
PancakeIterator(vector<MenuItem*> &m) :position(0), length(m.size())
{
menuItem = m;
}
virtual ~PancakeIterator(){}
virtual MenuItem* next()
{
MenuItem *p = menuItem[position];
position++;
return p;
} virtual bool hasNext()
{
if (position >= length || menuItem[position] == NULL)
{
return false;
}
return true;
}
}; #endif
#ifndef __MENU_H__
#define __MENU_H__
#include "Iterator.h"
class Menu
{
public:
Menu(){}
virtual ~Menu(){}
virtual Iterator * CreateIterator()= 0;
};
class PackageHouseMenu :public Menu
{
private:
vector<MenuItem*> menuItem; public:
PackageHouseMenu()
{
addItem("PancakeMunu: BlueBerry Pancakes", "Pancakes made with fresh blueberries", true, 3.49);
addItem("PancakeMunu: Waffles", "Waffles, with your choice of blueberries or strawberries", true, 3.59);
} ~PackageHouseMenu()
{
if (!menuItem.empty())
{
for (size_t i = 0; i < menuItem.size(); i++)
{
delete menuItem[i];
}
menuItem.clear();
}
} void addItem(const string na, const string des, bool vege, double pr)
{
MenuItem *t = new MenuItem(na, des, vege, pr);
menuItem.push_back(t);
} vector<MenuItem*> getMenuItem(){ return menuItem; }
Iterator *CreateIterator()
{
Iterator *iter = new PancakeIterator(menuItem);
return iter;
}
}; class DinerMenu :public Menu
{
private:
static const int MAXITEMS = 6;
int numberOfItems;
MenuItem * menuItem[MAXITEMS]; public:
DinerMenu()
{
numberOfItems = 0;
for (int i = 0; i < MAXITEMS; i++)
{
menuItem[i] = NULL;
}
addItem("DinerMenu: Hot dog", "a hot dog,with sauerkraut, relish, onions", false, 3.05);
addItem("DinerMenu: BLT", "Bacon with lettuce & tomato on whole wheat", false, 2.99);
}
~DinerMenu()
{
if (numberOfItems != 0)
{
for (int i = 0; i < numberOfItems + 1; i++)
{
delete menuItem[i];
}
}
} void addItem(const string na, const string des, bool vege, double pr)
{
if (numberOfItems > MAXITEMS)
{
cout << "Error, Can't Add More!" << endl;
}
else
{
MenuItem *p = new MenuItem(na, des, vege, pr);
menuItem[numberOfItems] = p;
numberOfItems++;
}
} MenuItem** getMenuItems()
{
return menuItem;
} Iterator *CreateIterator()
{
Iterator *iter = new DinerIterator(menuItem, numberOfItems + 1);
return iter;
}
};
#endif
#ifndef __WAITRESS_H__
#define __WAITRESS_H__
#include "Menu.h"
class Waitress
{
private:
Menu *panckage;
Menu *diner;
public:
Waitress(Menu *p, Menu *d)
{
panckage = p;
diner = d;
} ~Waitress()
{ } void printMenu(Iterator *it)
{
while (it->hasNext())
{
MenuItem *p = it->next();
cout << p->getName() << ", " << p->getDescription() << "," << p->getPrice() << endl;
}
} void printMenu()
{
Iterator* pan = panckage->CreateIterator();
Iterator* din = diner->CreateIterator();
printMenu(pan);
printMenu(din);
} };
#endif
#include <iostream>
#include "Waitress.h" using namespace std;
int main()
{
PackageHouseMenu *p = new PackageHouseMenu();
DinerMenu *d = new DinerMenu();
Waitress *w = new Waitress(p, d);
w->printMenu();
delete w;
delete p;
delete d;
return 0;
}

:迭代器模式1:Iterator的更多相关文章

  1. 迭代器模式(Iterator Pattern)

    迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式(Iterator)就是分离了聚合对象的遍历行为,抽象出一个迭代器来负责这样既可以 ...

  2. 第15章 迭代器模式(Iterator Pattern)

    原文 第15章 迭代器模式(Iterator Pattern) 迭代器模式(Iterator Pattern)    概述: 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构 ...

  3. 迭代器模式(Iterator.hasNaxt())

    迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为型模式. ...

  4. C#设计模式:迭代器模式(Iterator Pattern)

    一,什么是迭代器模式(Iterator Pattern) 提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示 二,看下面例子: using System; using Sys ...

  5. C#设计模式系列:迭代器模式(Iterator)

    迭代器模式把对象的职责分离,职责分离可以最大限度减少彼此之间的耦合程度,从而建立一个松耦合的对象.职责分离的要点是对被分离的职责进行封装,并以抽象的方式建立彼此之间的关系. 1.迭代器模式简介 1.1 ...

  6. 设计模式学习之迭代器模式(Iterator,行为型模式)(17)

    参考地址:http://www.cnblogs.com/zhili/p/IteratorPattern.html 一.介绍迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作 ...

  7. 深入浅出设计模式——迭代器模式(Iterator Pattern)

    模式动机 一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构.针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我 ...

  8. C#设计模式(16)——迭代器模式(Iterator Pattern)

    一.引言 在上篇博文中分享了我对命令模式的理解,命令模式主要是把行为进行抽象成命令,使得请求者的行为和接受者的行为形成低耦合.在一章中,将介绍一下迭代器模式.下面废话不多说了,直接进入本博文的主题. ...

  9. .NET设计模式(18):迭代器模式(Iterator Pattern)(转)

    概述 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据. ...

  10. 第 14 章 迭代器模式【Iterator Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> 周五下午,我正在看技术网站,第六感官发觉有人在身后,扭头一看,我C,老大站在背后,赶忙站起来, “王经理,你找我?” 我 ...

随机推荐

  1. Ubuntu更改源和搜狗输入法安装卸载

    安装完Ubuntu 16.04后,要更换为国内的软件源: sudo gedit /etc/apt/sources.list   #用文本编辑器打开源列表 在文件开头添加下面的阿里云的软件源: deb ...

  2. pseudotime专题

    review:Computational Methods for Trajectory Inference from Single-Cell Transcriptomics Tools/Algorit ...

  3. Robot Movement(机器人移动)

    中文标题[机器人移动] 这个题目是 Kayak 发布的代码挑战题目. 我认为题目本身描述的不是十分清楚,方法需要返回结果,但是结果没有说明是机器人最后的坐标位置,还是最后的坐标位置距离原点的距离.同时 ...

  4. java 字符串截取的几种方式(转)

    众所周知,java提供了很多字符串截取的方式.下面就来看看大致有几种. 1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的 ...

  5. summary ranges leetcode java

    问题描述: Given a sorted integer array without duplicates, return the summary of its ranges. For example ...

  6. deepin系统安装成功了之后重启电脑没有deepin启动选项的简单解决办法

    开机 连续按 f10(我的电脑是惠普的,由于主板的不同可能启动键也有所不同)进入 bios 界面如图 选择系统设置,启动选项  之后如图 选择 uefi  模式下的开机顺序栏的  操作系统管理员选项并 ...

  7. IntelliJ IDEA调试方法补充

    基本用法&快捷键 1.首先说第一组按钮,共8个按钮,从左到右依次如下: > Show Execution Point (Alt + F10):如果你的光标在其它行或其它页面,点击这个按钮 ...

  8. 笔记react router 4(四)

    看完Router的变化,接着来说<Switch>组件. 在3.X中,你可以指定很多子路由,但是只有第一个匹配的路径才会被渲染. 就像这样, <Route path='/' compo ...

  9. js操作字符串的常用方法

    使用 substring()或者slice() 函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=the ...

  10. python中RabbitMQ的使用(交换机,广播形式)

    简介 如果要让每个接收端都能收到消息,此时需要将消息广播出去,需要使用交换机. 工作原理 消息发送端先将消息发送给交换机,交换机再将消息发送到绑定的消息队列,而后每个接收端都能从各自的消息队列里接收到 ...