【行为型模型】迭代器模式

一、迭代器模式概述

        迭代器模式定义提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。把游走的任务放在送代器上,而不是聚合上。这样简化了聚含的接口和实现,也让责任各得其所。(对象行为型)

  • 迭代器模式的优缺点
    • 优点
      • 1.访问一个聚合对象的内容而无须暴露它的内部表示;
      • 2.遍历任务交由迭代器完成,这简化了聚合类;
      • 3.它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历;
      • 4.增加新的聚合类和迭代器类都很方便,无须修改原有代码;
      • 5.封装性良好,为遍历不同的聚合结构提供一个统一的接口;
    • 缺点
      • 增加了类的个数,这在一定程度上增加了系统的复杂性。

  • 适用环境
    • 内容保密 : 访问集合对象的内容 , 无需暴露内部表示 ;
    • 统一接口 : 为遍历不同的集合结构 , 提供统一接口。

二、代码实现

        迭代器模式主要包含四个角色:

  • 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。
  • 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。
  • 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、first()、next() 等方法。
  • 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
        2.1 抽象聚合(MenuItem)
package iterator.Menu;
//抽象聚合角色
public class MenuItem {// 名称String name;// 描述String description;// 是否为素食boolean vegetarian;// 价格double price;public MenuItem(String name,String description,boolean vegetarian,double price) {this.name = name;this.description = description;this.vegetarian = vegetarian;this.price = price;}public String getName() {return name;}public String getDescription() {return description;}public double getPrice() {return price;}public boolean isVegetarian() {return vegetarian;}
}
        2.2 具体聚合(DinnerMenu)
package iterator.Menu;
//菜单类
public class DinnerMenu {// 菜单总数private final static int MAX_NUMBER_OF_ITEMS = 4;private MenuItem[] menuItems;// 菜单量private int numberOfItems = 0;// 初始化数组,添加菜单内容public DinnerMenu() {menuItems = new MenuItem[MAX_NUMBER_OF_ITEMS];addItem("pancake1", "good1", true, 10.5);addItem("pancake2", "good2", false, 11.5);addItem("pancake3", "good3", true, 12.5);addItem("pancake4", "good4", false, 13.5);}// 创建一个添加菜单方法public void addItem(String name, String description, boolean vegetarian, double prive) {MenuItem menuItem = new MenuItem(name, description, vegetarian, prive);if (numberOfItems >= MAX_NUMBER_OF_ITEMS) {throw new RuntimeException("超过最大数量");} else {//菜单没满可以继续添加menuItems[numberOfItems] = menuItem;numberOfItems++;}}// 使用迭代器遍历菜单public Iterator createIterator() {return new DinnerMenuIterator(this.menuItems);}//..其他方法
}
        2.3 抽象迭代器
package iterator.Menu;
//抽象迭代器
public interface Iterator {// hasNext()方法返回一个布尔值,让我们知道是否还有更多的元素boolean hasNext();// next()方法返回下一个元素Object next();
}
        2.4 具体迭代器(DinnerMenuIterator)
package iterator.Menu;
//具体迭代器,餐厅菜单
public class DinnerMenuIterator implements Iterator {MenuItem[] items;// iteratorIndex记录当前数组遍历的位置int iteratorIndex = 0;;// 构造器需要被传入一个菜单项的数组当做参数public DinnerMenuIterator(MenuItem[] items) {this.items = items;}// next()方法返回数组内的下一项,并递增其位置public Object next() {MenuItem menuItem = items[iteratorIndex];iteratorIndex = iteratorIndex + 1;return menuItem;}// hasNext()方法会检查我们是否已经取得数组内所有的元素。// 如果还有元素待遍历,则返回truepublic boolean hasNext() {if (iteratorIndex >= items.length || items[iteratorIndex] == null) {return false;} else {return true;}}
}
        2.5 服务员(Waitress)
package iterator.Menu;
//服务员
public class Waitress {PancakeHouseMenu pancakeHouseMenu;DinnerMenu dinnerMenu;// 在构造器中,女招待照顾两个菜单public Waitress(PancakeHouseMenu pancakeHouseMenu, DinnerMenu dinnerMenu) {this.pancakeHouseMenu = pancakeHouseMenu;this.dinnerMenu = dinnerMenu;}public void printMenu() {// 这个printMenu()方法为每一个菜单各自创建一个迭代器Iterator pancakeIterator = pancakeHouseMenu.createIterator();Iterator dinnerIterator = dinnerMenu.createIterator();// 然后调用重载的printMenu(),将迭代器传入printMenu(pancakeIterator);System.out.println("\nLunch");// 调用下面重载的方法printMenu(dinnerIterator);}// 这个重载的printMenu()方法,使用迭代器来遍历菜单项并打印出来// 使用迭代器(一次循环即可)来遍历菜单项并打印出来,只调用Iterator接口private void printMenu(Iterator iterator) {while (iterator.hasNext()) {MenuItem menuItem = (MenuItem) iterator.next();System.out.println(menuItem.getName() + " " +menuItem.getPrice() + " " + menuItem.getDescription());}}
}
        2.6 main方法实现迭代器(Test)
package iterator.Menu;public class Test {public static void main(String[] args) {// TODO Auto-generated method stubPancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();        DinnerMenu dineMenu = new DinnerMenu();/***两个菜单都实现一样的方法,但是并没有实现相同的接口,*女招待还是要依赖两个具体实现的菜单类*后面就要修改这里**/Waitress waitress = new Waitress(pancakeHouseMenu, dineMenu);waitress.printMenu();}}
        2.7 UML图

三、代码结构图

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

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

相关文章

virtualbox 网络设置实现主机和虚拟机互相访问

前言 一般来说,virtualbox 虚拟机的上网模式是 NAT。这样虚拟机可以上网并访问宿主机,但宿主机无法访问虚拟机,也无法 ping 通。下面介绍双网卡模式,实现虚拟机和宿主机能够互相访问 ping 通。 双网卡模式 进入虚拟机的网络设置…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别 一、简单介绍 二、简单人脸识别实现原理 三、简单人脸识别案例实现简单步…

C语言—深度剖析函数指针,函数指针数组

我们先来看一段代码 #include <stdio.h> void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; }输出的是两个地址&#xff0c;这两个地址是 test 函数的地址。 那我们的函数的地址…

杰理695的UI模式LED灯控制

UI模式LED灯修改每个模式对应的LED灯闪烁修改在ui_normal_status_deal(u8 *status, u8 *power_status, u8 ui_mg_para)

关系型数据库中primary key和foreign key、索引的作用

文章目录 一、关系型数据库中主键(primary key)和外键(foreign key)的概念。二、MySQL索引的作用(索引的优缺点)一、关系型数据库中主键(primary key)和外键(foreign key)的概念。 二、MySQL索引的作用(索引的优缺点) MySQL索引是一种数据结构,它可以提高查询性能…

MATLAB初学者入门(13)—— 遗传算法

遗传算法是一种受自然选择和遗传学启发的搜索启发式算法&#xff0c;用于解决优化和搜索问题。它模拟了自然界中生物的进化过程&#xff0c;包括基因的选择、交叉&#xff08;杂交&#xff09;和变异。 MATLAB 提供了一个方便的工具箱&#xff0c;即全局优化工具箱&#xff0c;…

网卡技术解密:理解网卡背后的原理

✍✍在这个信息爆炸的时代&#xff0c;网卡承载着无数数据的流动&#xff0c;是我们日常生活和工作不可或缺的一部分。但是&#xff0c;您是否曾经好奇过&#xff0c;这些小小的硬件是如何在瞬息万变的网络世界中稳定地发挥作用的呢&#xff1f; 想象一下&#xff0c;每当我们…

计算机缺少msvcp120.dll如何解决,7种详细的修复方法分享

msvcr120.dll文件是微软Visual C运行时库的一部分&#xff0c;版本号为12.0。这个DLL文件包含了许多用于支持在Windows上运行的应用程序的重要函数和组件。它是确保某些程序能够正确执行的关键组成部分&#xff0c;特别是那些使用C编写或依赖于某些Microsoft库的程序。 当用户…

家用充电桩有必要买21KW交流充电桩吗?

随着电动汽车的普及和人们环保出行意识的增强&#xff0c;充电设施的需求日益增长。在选择充电桩时&#xff0c;很多人会考虑到充电速度、功率等因素。而作为交流充电桩中充电效率最高的一种&#xff0c;21KW交流充电桩是否值得购买呢&#xff1f; 从成本角度来看&#xff0c;2…

只需几步,即可享有笔记小程序

本示例是一个简单的外卖查看店铺点菜的外卖微信小程序&#xff0c;小程序后端服务使用了MemFire Cloud&#xff0c;其中使用到的MemFire Cloud功能包括&#xff1a; 其中使用到的MemFire Cloud功能包括&#xff1a; 云数据库&#xff1a;存储外卖微信小程序所有数据表的信息。…

画图的神器及必备的调色和选图工具

大学生研究生论文写作及画图的神器 前言常用的工具集合画图工具配色参考画图神器词云 最后下篇 前言 好久没有更博&#xff0c;来更一下吧。最近刚好被问到平常是用什么来画图的&#xff0c;包括会议论文&#xff0c;各种类型的PPT汇报以及项目报告等等里面的图怎么画好。所以…

YoloV8改进策略:卷积改进|DOConv轻量卷积,即插即用|适用各种场景

摘要 本文使用DOConv卷积&#xff0c;替换YoloV8的常规卷积&#xff0c;轻量高效&#xff0c;即插即用&#xff01;改进方法非常简单。 DO-Conv&#xff08;Depthwise Over-parameterized Convolutional Layer&#xff09;是一种深度过参数化的卷积层&#xff0c;用于提高卷…

用户实践:从 HBase 升级为OceanBase,仟传实现110000 TPS的千亿级KV性能优化

本文作者&#xff1a;仟传网络科技技术专家 刘贵宗 & 肖旺生 一、业务需求及选型背景 仟传网络科技&#xff08;TargetSocial&#xff09;&#xff0c;是国内知名的内容社交平台整合营销服务商&#xff0c;为企业级客户提供高效的KOL&#xff08;关键意见领袖&#xff09;…

互联网大厂ssp面经,数据结构:part1

1. 数组和链表的区别是什么&#xff1f; a. 数组是一种线性数据结构&#xff0c;存储在连续的内存块中&#xff0c;元素可以通过索引直接访问。 b. 链表是由节点组成的数据结构&#xff0c;每个节点包含数据和指向下一个节点的指针。 2. 数组和链表的的优缺点是什么&#xff…

旅游网站制作流程

旅游网站制作流程是一个较复杂的过程&#xff0c;因为它需要结合市场调研、用户需求、内容构建、技术开发等多个方面。在这篇文章中&#xff0c;我将简单介绍一下旅游网站的制作流程&#xff0c;大致分为以下步骤。 第一步&#xff1a;市场调研 在制作旅游网站前&#xff0c;我…

【机器学习】分类与预测算法的评价与优化

以实际案例解析F1值与P-R曲线的应用 一、分类算法与性能评价的重要性二、F1值与P-R曲线的概念与意义三、实例解析&#xff1a;以垃圾邮件检测为例四、代码实现与结果分析五、结论与展望 在数据驱动的时代&#xff0c;机器学习算法以其强大的数据处理和分析能力&#xff0c;成为…

会计凭证替代和验校

会计凭证替代和验校 一、替代 在凭证保存前根据设置条件判断此凭证是否有效&#xff0c;其中可以按抬头、行项目或完全凭证来判断,然后再根据Validation设置的消息类型决定凭证是否允许保存。SAP校验是对在系统输入的数据按照规则设定检验是否正确&#xff0c;可以按抬头、行…

基于springboot实现疫情下图书馆管理系统项目【项目源码+论文说明】

基于springboot实现疫情下图书馆管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了疫情下图书馆管理系统的开发全过程。通过分析疫情下图书馆管理系统管理的不足&#xff0c;创建了一个计算机管理疫…

快速入门SpringCloudAlibaba实战篇【SpringBoot3.x + JDK17】!

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…

SpringBoot下载Excel模板功能

目录 一、前端只需要填写一个a标签调用一下后端接口即可 二、后端 2.1 准备一个excel模板 &#xff0c;将其复制到resource目录下的templates文件夹下 2.2 接着复制下列代码即可 三、运行效果 一、前端只需要填写一个a标签调用一下后端接口即可 1.1 先代理一下防止跨域 e…