:迭代器模式1:Iterator
//今天一口气把这一章前半部分的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的更多相关文章
- 迭代器模式(Iterator Pattern)
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式(Iterator)就是分离了聚合对象的遍历行为,抽象出一个迭代器来负责这样既可以 ...
- 第15章 迭代器模式(Iterator Pattern)
原文 第15章 迭代器模式(Iterator Pattern) 迭代器模式(Iterator Pattern) 概述: 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构 ...
- 迭代器模式(Iterator.hasNaxt())
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为型模式. ...
- C#设计模式:迭代器模式(Iterator Pattern)
一,什么是迭代器模式(Iterator Pattern) 提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示 二,看下面例子: using System; using Sys ...
- C#设计模式系列:迭代器模式(Iterator)
迭代器模式把对象的职责分离,职责分离可以最大限度减少彼此之间的耦合程度,从而建立一个松耦合的对象.职责分离的要点是对被分离的职责进行封装,并以抽象的方式建立彼此之间的关系. 1.迭代器模式简介 1.1 ...
- 设计模式学习之迭代器模式(Iterator,行为型模式)(17)
参考地址:http://www.cnblogs.com/zhili/p/IteratorPattern.html 一.介绍迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作 ...
- 深入浅出设计模式——迭代器模式(Iterator Pattern)
模式动机 一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构.针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我 ...
- C#设计模式(16)——迭代器模式(Iterator Pattern)
一.引言 在上篇博文中分享了我对命令模式的理解,命令模式主要是把行为进行抽象成命令,使得请求者的行为和接受者的行为形成低耦合.在一章中,将介绍一下迭代器模式.下面废话不多说了,直接进入本博文的主题. ...
- .NET设计模式(18):迭代器模式(Iterator Pattern)(转)
概述 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据. ...
- 第 14 章 迭代器模式【Iterator Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> 周五下午,我正在看技术网站,第六感官发觉有人在身后,扭头一看,我C,老大站在背后,赶忙站起来, “王经理,你找我?” 我 ...
随机推荐
- Eclipse安装lombok
下载lombok 下载地址:https://projectlombok.org/downloads/lombok.jar 或者访问官网下载 https://projectlombok.org/ 安装 ...
- GEO数据下载分析(SRA、SRR、GEM、SRX、SAMN、SRS、SRP、PRJNA全面解析)
很多时候我们需要从GEO(https://www.ncbi.nlm.nih.gov/geo/)下载RNA-seq数据,一个典型的下载页面是https://www.ncbi.nlm.nih.gov/ge ...
- FreeBSD之基本配置
1. 设置IP地址.网关ee /etc/rc.conf ifconfig_em0="inet 192.168.21.173 netmask 255.255.255.0" #设置 ...
- p1470 Longest Prefix
原本就想到dp,可是是我的思路是在串的各个位置都遍历一次set,看dp[i-st[k]]是否为1且前length(st[k])是st[k].这样200000*200*10会超时.更好的办法是在i位取前 ...
- uWSGI和Gunicorn
因为nginx等优秀的开源项目,有不少本来不是做服务器的同学也可以写很多服务器端的程序了.但是在聊天中会发现,大家虽然写了不少代码,但是对wsgi是什么,gunicorn是什么,反向代理又是什么并不了 ...
- IDEA分享项目到GitHub出现Could not read from remote repository
如果VCS->Import into Version Control->Share Project on GitHub出现如下错误:: 重点在最后一行Could not read from ...
- TCHAR用法
TCHAR 就是当你的字符设置为什么就是什么例如:程序编译为 ANSI, TCHAR 就是相当于 CHAR当程序编译为 UNICODE, TCHAR 就相当于 WCHAR char :单字节变量类型, ...
- 转载-Mac下面的SecureCRT(附破解方案) 更新到最新的8.0.2
原帖地址:http://bbs.feng.com/read-htm-tid-6939481.html,爱死楼主了,哈哈 真心感谢 继续更新到8.3.0的破解,整体的破解方案都发生了的变化首先还是去ht ...
- python 小练习3
求大蜜题:给你两个正整数a(0 < a < 100000)和n(0 <= n <=100000000000),计算(a^n) % 20132013并输出结果 ret = 1 d ...
- 局域网两台机器ping超时
在防火墙的高级设置中的入站规则里,找icmpv4 ,我的两条电脑都是无线连的,看你的无线是专用还是公用,开启对应的规则. windows默认是关闭的,我的系统前些天刚重置过,ping超时,还是要手动开 ...