//今天一口气把这一章前半部分的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. BGP - 4,BGP的三张表

    1,BGP的三张表      邻居表(adjancy table)      BGP表(forwarding database):BGP默认不做负载均衡,会选出一条最优的,放入路由表      路由表 ...

  2. android--------自定义控件 之 组合控件篇

    上篇介绍了自定义控件的自定义属性篇,地址:http://www.cnblogs.com/zhangqie/p/8969163.html 这篇博文主要来说说 自定义控件的组合控件来提高布局的复用 使用自 ...

  3. android--------自定义控件 之 属性篇

    上篇介绍了自定义控件的一个简单案例,本篇文章主要介绍如何给自定义控件自定义一些属性. Android 中使用自定义属性的一般步骤: 定义declare-styleable,添加attr 使用Typed ...

  4. python3—列表

    列表是什么 name = ["jim", "lilei", "lucy"] #方括号表示,逗号分隔 print(name) print(na ...

  5. apiCloud 调微信支付,调支付宝支付

    data里面的参数信息,需要从后台接口中调取,点击查看微信支付详情,https://docs.apicloud.com/Client-API/Open-SDK/wxPay 首先,需要在config.x ...

  6. SQL 2016安装

    微软数据库SQL Server 2016正式版在2016年6月就发布,由于近期工作忙,一直拖到现在才有时间把安装过程写到博客上,分享给大家.本人一直习惯使用英文版,所以版本和截图都是英文版的.废话少说 ...

  7. 《剑指offer》总结一

    目录 1.二维数组中的查找(223ms) 2.替换空格(24ms) 3.从尾到头打印链表(22ms) 4.重建二叉树(37ms) 5.用两个栈实现队列 1.二维数组中的查找(223ms) 题目描述: ...

  8. 【洛谷p1060】开心的金明

    (DP背包第一题,值得记录思路呀) 开心的金明[传送门] 洛谷算法标签: 01背包问题的思路分析见[总结]01背包问题 这道题显然是典型的01背包问题,首先我们显然可以由输入的第i个物体的价格v[i] ...

  9. 封装jsonp

    1.写一个类封装jsonp: jsonp(url, params, success, funName)     参数url:请求地址     参数params:请求数据,可以是json对象,或形如&q ...

  10. 本地仓库有jar包maven依然报错的原因

    本地Maven仓库有所需jar包依然报错,missing……………… 既然有这个jar包为什么还会报错呢? 找到本地仓库后发现里面有一个_remote.repositories文件 问题在_remot ...