设计模式之八:迭代器与组合模式

有许多方法可以把对象堆起来成为一个集合(Collection),比如放入数组、堆栈或散列表中。若用户直接从这些数据结构中取出对象,则需要知道具体是存在什么数据结构中(如栈就用peek,数组[])。迭代器能够让客户遍历你的对象而又无法窥视你存储对象的方式。

对象村餐厅和煎饼屋合并了,它们有着不同的菜单列表,但菜单项基础都是一样的。

class MenuItem
{
private:string name;string description;bool vegetarian;double price;public:MenuItem(string name, string description, bool vegetarian, double price){this->name = name;this->description = description;this->vegetarian = vegetarian;this->price = price;}string getName(){return name;}string getDescription(){return description;}bool isVegetarian(){return vegetarian;}double getpPrice(){return price;}
};

下面就写Java代码了,改成C++一时半会还是做不过来。

public class PancakeHouseMenu
{ArrayList menuItems;public PancakeHouseMenu(){menuItems = new ArrayList();addItem("K&B's Pancake Breakfast", "Pancakes with scrambled eggs, and toast", true, 2.99);}public void addItem(String name, String description, boolean vegetarian, double price){MenuItem menuItem = new MenuItem(name, description, vegetarian, price);menuItems.add(menuItem);}public ArrayList getMenuItems(){return menuItems;}
};/ ********************************************************/
public class DinerMenu
{static final int MAX_ITEMS = 6;int numberOfItems = 0;MenuItem[] menuItems;public DinerMenu(){menuItems = new MenuItem[MAX_ITEMS];addItem("Vegetarian BLT", "Fakin Bacon", true, 2.99);}public void addItem(String name, String description, boolean vegetarian, double price){MenuItem menuItem = new MenuItem(name, description, vegetarian, price);if (numberOfItems >= MAX_ITEMS){System.err.println("Sorry, menu is full! Can't add item to menu");}else{menuItems[numberOfItems++] = menuItem;}}public MenuItem[] getMenuItems(){return menuItems;}
};

这两种不同的菜单表现方式,会使得女招待需要知道菜单的实现细节,才能对菜单进行遍历。

PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
ArrayList breakfastItems = pancakeHouseMenu.getMenuItems();for breakfastItems.size()
MenuItem menuItem = (MenuItem)breakfastItems.get(i);/ ******************************************************************* /
DinerMenu dinerMenu = new DinerMenu();
MenuItem[] lunchItems = DinerMenu.getMenuItems();for lunchItems.size()
MenuItem menuItem = lunchItems[i];

如果还有第三家餐厅以不同的实现出现,我们就需要有三个循环。

因此,我们需要创建一个对象(迭代器),封装“遍历集合内的每个对象的过程”。

Iterator iter = breakfastItems.createIterator();while (iter.hasNext())
{MenuItem menuItem = (MenuItem)iter.next();
}

 当我们拥有迭代器接口后,我们就可以为各种对象集合实现迭代器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618729.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

占领手机,银行App的隐秘战事

作者 | 辰纹 来源 | 洞见新研社 十几年前,银行用各类卡片塞满我们的钱包;如今,银行用各种App塞满我们的手机。 说出来可能很多人还不相信,民商智慧《2019银行业电子银行场景营销分析报告》就提到,在2019年3月时&…

Nginx详解 一:编译安装Nginx和Nginx模块

文章目录 1.HTTP 和 Nginx1.1 Socket套接字1.2 HTTP工作机制1.2.1一次http事务1.2.2 资源类型1.2.3提高HTTP连接性能 2. I/O模型2.1 I/O模型相关概念2.2 网络I/O模型2.2.1 **阻塞型** **I/O** 模型(blocking IO)2.2.2 **非阻塞型** **I/O** **模型** **(…

android 系统(20)---背光灯

图1 这是MTK 2011年的图,下面给出MT6575/6577中此部分的框架图: 图2 再来看更体现一些细节的框架图: 图3 由此可见光系统从上到下依次分为java APP层、java 框架层、本地层和驱动层。下面就来看APP层,先给出调节背光的应用界面…

Ubuntu16.04设置背光灯发亮快捷键

Ubuntu16.04设置背光灯发亮快捷键 分三步: 1.新建根目录 mkdir ~/bin2编辑背光灯控制开关的脚本文件 vim ~bin/ledctrl将以下内容复制 #!/bin/bash - # # # FILE: ledctrl # # USAGE: ./ledctrl # # DESCRIPTION: # # OPTIONS: …

Linux c++开发-02-g++命令行编译

有如下的文件目录结构 格式一 swap.h swap.cpp main.cpp 编译方法和结果如下: 格式二 swap.cpp main.cpp 使用命令:g main.cpp src/swap.cpp -o main.exe 解决方法使用参数 -I 格式三-将swap.cpp生成一个静态库然后链接到main.cpp中 生成…

C语言文件操作收尾【随机读写 + 结束判定 + 文件缓冲区】

全文目录 前言fseek 重定位位置指示器函数ftell 获取当前文件指示器的位置rewind 重置位置指示器文本文件和二进制文件文件读取结束的判定feof 和 ferror 文件缓冲区总结 前言 有了文件的顺序读写基础,那么肯定会好奇文件的随机读写,毕竟顺序读写对于有…

python抢票开发——设备预约助手实现

女朋友是药学院的,做实验时需要在特定的网站上进行设备预约,由于预约人数过多,从而导致从浏览器登录不进去或者登录进去预约失败等情况,所以我用python帮她写了一个抢位助手,让程序自动去进行位置预定,实测…

春节Python抢票神器,支持候补抢票真的无敌了

想要回家的小伙伴们,大概经历了一波抢票大战。 一年一度春运着实让人难熬 这次顺便把一个Python抢票工具,送到了GitHub趋势榜第一。 项目名很干脆,就是12306,来自名叫文贤平的程序员。 这很可能是全GitHub最德高望重的购票小助手了,功能一直在更新,且现已支持Python …

Java IO流动(实战操作)

目录 1 IO流原理2 IO流的分类3 输入、输出流代码示例4 小结5 文件在前后台之间传递 在Java中,IO流是一种用于处理输入和输出操作的机制。它提供了一种统一的方式来读取和写入数据,平日开发中在文件读写,网络通信,特定场景的数据库…

老话题,火车票抢票助手,简化版 (漏洞已经失效^_^)

用了“二杠”兄弟的工具测试了抢票,先举个大拇指。牛!可是我实在看不惯他画的界面,而且需要认证和访问他服务器上的wcf服务。看到许多园友都号称“破解”了。我也请出"Reflector"神器,尝试了下。发现把源exe文件作为app…

python模拟火车订票系统_如何用python编写火车抢票助手

前几天跟朋友说打算写一个抢票助手,最后由于某些原因念头打消了。 可就在昨天晚上,才隐约记起一年前的自己曾经说过:一年后我一定要写一个12306的抢票助手!瞬间激情澎湃,甚至已经是快临近凌晨时便开始动工,…

无涯教程-Python机器学习 - Based on human supervision函数

Python机器学习 中的 Based on human s - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-based-on-human-supervision.html

Yolo系列-yolov3

YOLO-V3 这张图讲道理真的过分了!!!我不是针对谁,在座的各位都是 终于到V3了,最大的改进就是网络结构,使其更适合小目标检测特征做的更细致,融入多持续特征图信息来预测不同规格物体 先验框更丰…

java 分布式游戏服务器框架,集群游戏服务器框架,游戏服务器网关框架 ioGame 网络游戏服务器框架

网络游戏框架简介 ioGame 是一个由 java 语言编写的网络游戏服务器框架。支持 websocket、tcp ,适用于全球同服、回合制游戏、策略游戏、即时战斗等游戏服务器的开发。具有高性能、稳定、易用易扩展、超好编程体验等特点。可做为 H5、手游、端游的 java 游戏服务器…

游戏服务器架构通识

前言 这节讲座里,我们将从游戏服务器发展的简单历程出发,鸟瞰一下目前大多数的游戏服务器架构。 这里尽可能的避免陷入细节的技术问题,而是从技术进化的结果状态,反推原始问题是什么。希望能通过这个过程,解释清楚游戏…

游戏服务器架构设计整理

文章目录 前言一、单进程多线程的服务器设计模式,只有一个进程,但一个进程包好多个线程二、多进程单线程的服务器设计模式,多个进程,每个进程只有一个线程1.早期的MMORPG服务器结构2.中期-用户分离集群式3.中后期数据分离集群式4.…

游戏服务器被攻击了怎么办?

随着互联网的发展,网民数量激增,电子游戏的普及,庞大的玩家数量必然推动游戏市场发展。游戏受到攻击是游戏开发者的痛点,DDOS攻击是流量攻击的一个总称,还包括SYN Flood、ACK Flood、UDP Flood、TCP Flood、ICMP Flood…

经典游戏服务器端架构

文章目录 一、 讨论的背景二、 游戏服务器架构的要素三、核心的三个架构四、 游戏服务器模型的进化历程五、分服模型1.模型描述2.调度架构1.单进程游戏服务器2.多进程游戏服务器 3.内存架构1.动态内存2.预分配内存 4.进程间通讯手段1.Socket通讯2.消息队列3.远程调用 5.容灾和扩…

哪家的云游戏服务器好?如何选择云游戏服务器?

现如今,不少行业领域都对云服务器有不少的需求,尤其是游戏行业,需要专门的云游戏服务器。目前市场上的云游戏服务器有很多种类型,那么,哪家的云游戏服务器好呢?如何选择云游戏服务器?下面就跟着…

游戏开发商如何租用合适稳定的游戏服务器?

随着互联网的快速发展,网络游戏的发展令人目不暇接。有些游戏开发商在开发游戏时,对游戏服务器的要求非常高,毕竟一款游戏最重要的是流畅度。如果大量用户在玩游戏,而游戏直接因为服务器的宕机而崩溃,这种体验可能会直…