//今天一口气把这一章前半部分的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. Java中类似C#中Task.wait()的类CountDownLatch

    当主线程开辟多个子线程,而又需要这些子线程都执行完成后再执行主线程后续的操作,在C#中可以通过Task的wait方法来实现,然而在Java中也有类型的类CountDownLatch,具体用法如下: p ...

  2. nginx如何处理请求

    有必要了解一下nginx转发请求的方式,弄清它是如何转发请求的对我们理解nginx的server块的配置很有意义(虽然我也还不是很明白) 上一节说了配置文件中可以有多个server块,所以这里我配置2 ...

  3. PHP数组排序函数有哪些

    PHP数组排序函数有哪些 一.总结 一句话总结:其实也就是是否保持索引,对键排序还是对值排序,除了sort,rsort.shuffle,usort外,都是保持索引的 是否保持索引 键排序 值排序 除了 ...

  4. 雷林鹏分享:使用 XSLT 显示 XML

    使用 XSLT 显示 XML 通过使用 XSLT,您可以把 XML 文档转换成 HTML 格式. 使用 XSLT 显示 XML XSLT 是首选的 XML 样式表语言. XSLT(eXtensible ...

  5. centOS 6.5安装python和nginx

    一.安装python3.5 1.安装python3.5

  6. Plus One leetcode java

    问题描述: Given a non-negative number represented as an array of digits, plus one to the number. The dig ...

  7. php 出现Warning: A non-numeric value encountered问题的原因及解决方法

    在使用(+ - * / ** % << >> | & ^) 运算时,例如a+b,如果a是开始一个数字值,但包含非数字字符(123a),b不是数字值开始时(b456),就 ...

  8. 2017-4-13/MySQL

    1. mysql一般的连接方式都有哪些,各自优缺点. MySQL:过程式风格,最常用. MySQLi:MySQL的增强扩展,提供了过程化和面向对象两种风格的API,增加了预编译和参数绑定等新特性, 但 ...

  9. [转载]完全理解Python迭代对象、迭代器、生成器

    译文地址:liuzhijun 在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导 ...

  10. zzw原创_expdp及impdp中的exclude及include参数的那点事

    zzw原创:转载请注明出处 在oracle的expdp 及imdpd命令中,exclude及include参数还是有一些要注意的地方,特别是涉及选择性条件时. 一.通用 1.exclude及inclu ...