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

一、迭代器模式概述

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

  • 迭代器模式的优缺点
    • 优点
      • 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://www.hqwc.cn/news/642025.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

等保测评之主机测评详解(二级)

等保测评之主机测评详解(二级)服务器——Windows 身份鉴别: 测评项a): a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 整改方…

HTTP慢连接攻击的原理和防范措施

随着互联网的快速发展,网络安全问题日益凸显,网络攻击事件频繁发生。其中,HTTP慢速攻击作为一种隐蔽且高效的攻击方式,近年来逐渐出现的越来越多。 为了防范这些网络攻击,我们需要先了解这些攻击情况,这样…

Java、Spring、Dubbo三者SPI机制原理与区别

Java、Spring、Dubbo三者SPI机制原理与区别 什么是SPI SPI全称为Service Provider Interface,是一种动态替换发现的机制,一种解耦非常优秀的思想,SPI可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实…

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

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

牛客周赛 Round 40(A,B,C,D,E,F)

比赛链接 官方讲解 这场简单,没考什么算法,感觉有点水。D是个分组01背包,01背包的一点小拓展,没写过的可以看看,这个分类以及这个题目本身都是很板的。E感觉就是排名放高了导致没人敢写,本质上是个找规律…

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

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

【漏洞复现】锐捷 EG易网关 phpinfo.view.php 信息泄露漏洞

0x01 产品简介 锐捷EG易网关是一款综合网关产品,集成了先进的软硬件体系构架,并配备了DPI深入分析引擎、行为分析/管理引擎。这款产品能在保证网络出口高效转发的基础上,提供专业的流控功能、出色的URL过滤以及本地化的日志存储/审计服务。 …

Github首页美化(updating)

Github首页美化 https://github.com/QInzhengk一、新建仓库二、美化Github首页主页访问量统计仓库状态统计常用语言占比统计社交链接 界面展示 https://github.com/QInzhengk 一、新建仓库 对Github首页进行美化,需要新建一个仓库名和自己 Github 用户名相同的仓库…

yolo-驾驶行为监测:驾驶分心检测-抽烟打电话检测

在现代交通环境中,随着汽车技术的不断进步和智能驾驶辅助系统的普及,驾驶安全成为了公众关注的焦点之一 。 分心驾驶,尤其是抽烟、打电话等行为,是导致交通事故频发的重要因素。为了解决这一问题,研究人员和工程师们…

kubernetes部署控制器Deployment

一、概念 在学习rc和rs控制器资源时,这两个资源都是控制pod的副本数量的,但是,他们两个有个缺点,就是在部署新版本pod或者回滚代码的时候,需要先apply资源清单,然后再删除现有pod,通过资源控制&…

南京邮电大学数学实验A答案 | 《MATLAB数学实验》第三版课后习题答案

数学实验A 本仓库收集了2024年我在学习《数学实验A》课程期间完成的作业。课程使用的教材为《MATLAB数学实验》第三版,作者为胡良剑和孙晓君教授。 这个资源库的建立初衷是为了帮助南京邮电大学的同学们在学习过程中有一个参考的依据,减少一些无端浪费…

微机原理实验二、编写一个程序,要求比较两个字符串STRING1和STRING2所含的字符是否相同,相同则显示“MATCH”,若不同则显示“NO MATCH”

微机原理实验二、编写一个程序,要求比较两个字符串STRING1和STRING2所含的字符是否相同,相同则显示“MATCH”,若不同则显示“NO MATCH” 实验目标: 编写一个程序,要求比较两个字符串STRING1和STRING2所含的字符是否相…