java设计模式-迭代器模式

java设计模式-迭代器模式

一、了解迭代器模式

1.1 什么是迭代器模式

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

迭代器模式把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也可以让责任各得其所。

1.2 迭代器模式组成结构

  • 迭代器(Iterator):迭代器定义访问和遍历元素的接口。
  • 具体迭代器(ConcreteIterator):具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置。
  • 聚合(Aggregate):聚合定义创建相应迭代器对象的接口。
  • 具体聚合(ConcreteAggregate):具体聚合实现创建相应迭代器的接口,该操作返回 ConcreteIterator 的一个适当的实例。

1.3 迭代器模式 UML 图解
在这里插入图片描述

1.4 迭代器模式适用场景

  • 访问一个聚合对象的内容而无需暴露它的内部表示
  • 支持对聚合对象的多种遍历
  • 为遍历不同的聚合结构提供一个统一的接口

二、迭代器模式具体应用

2.1 问题描述

包子店与沙县小吃合并啦:有一家包子店,他们负责提供早餐,卖各式各样的包子,并提供豆浆之类的饮品;也有一家沙县小吃,它们负责提供午餐和晚餐,卖一些盖浇饭和煲仔饭。为了获得更多的盈利,后来这两家店合并了。

但是却发现了一个问题,原来的包子店提供的菜单是用 List 集合结合存储的,而沙县小吃的菜单却是由数组存储的。所以在提供菜单的时候就会很麻烦,需要使用两个不同的循环来遍历对应的集合和数组,才能打印完整的菜单 (当然这项工作是由服务员完成的)。有没有更好的解决办法呢?这时候迭代器模式就登场了。

现在我们将这个问题用到代码中去实现。

2.2 迭代器模式问题设计
在这里插入图片描述

2.3 代码实现
菜单信息封装 MenuItem 类

/*** 用来封装菜单食物信息*/
public class MenuItem {String name;   //食物名字double price;    //食物价格public MenuItem(String name, double price){this.name = name;this.price = price;}public String getName() {return name;}public double getPrice() {return price;}
}

聚合 菜单接口

//菜单接口
public interface Menu {Iterator<MenuItem> createIterator();
}

具体聚合 BZMenu 类

/*** 包子菜单类,实现了 Menu 接口中的 createIterator() 方法*/
public class BZMenu implements Menu{List<MenuItem> menuItems;/*** 通过构造函数,在菜单里添加一些菜品*/public BZMenu() {menuItems = new ArrayList<>();addItem("雪菜包",1.0);addItem("灌汤包",1.0);addItem("韭菜包",1.0);addItem("猪肉包",1.0);}public void addItem(String name, double price){MenuItem menuItem = new MenuItem(name, price);menuItems.add(menuItem);}/*** 返回包子菜单信息的迭代器* * @return*/@Overridepublic Iterator<MenuItem> createIterator() {return new BZMenuIterator(menuItems);}
}

具体聚合 SXMenu 类

/*** 沙县菜单类,实现了 Menu 接口中的 createIterator() 方法*/
public class SXMenu implements Menu{static final int MAX_ITEMS = 4;int indexOfItems = 0;MenuItem[] menuItems;/*** 通过构造函数,在菜单里添加一些菜品*/public SXMenu(){menuItems = new MenuItem[MAX_ITEMS];addItem("青椒肉丝盖浇饭",10.0);addItem("西红柿鸡蛋盖浇饭",10.0);addItem("牛肉土豆煲仔饭",15.0);addItem("金针菇煲仔饭",10.0);}public void addItem(String name, double price){MenuItem menuItem = new MenuItem(name, price);if(indexOfItems >= MAX_ITEMS){System.out.println("菜单已满!");}else {menuItems[indexOfItems] = menuItem;indexOfItems ++;}}/*** 返回沙县菜单信息的迭代器*/@Overridepublic Iterator<MenuItem> createIterator() {return new SXMenuIterator(menuItems);}
}

具体迭代器 BZMenuIterator 类 (核心)

/*** 包子菜单信息迭代器*/
public class BZMenuIterator implements Iterator {List<MenuItem> menuItems;int position = 0;/*** 通过构造函数,实例化存储包子信息的菜单 List 集合* 虽然可以直接使用 Iterator 来遍历集合,为了更好理解迭代器模式,这里自己手写一个迭代器* * @param menuItems*/public BZMenuIterator(List<MenuItem> menuItems){this.menuItems = menuItems;}@Overridepublic boolean hasNext() {if(position >= menuItems.size() || menuItems.get(position) == null){return false;}else {return true;}}@Overridepublic Object next() {MenuItem menuItem = menuItems.get(position);position += 1;return menuItem;}
}

具体迭代器 SXMenuIterator 类

/*** 沙县菜单迭代器*/
public class SXMenuIterator implements Iterator {MenuItem[] menuItems;int position = 0;/*** 通过构造函数实例化存储沙县信息的菜单数组* * @param menuItems*/public SXMenuIterator(MenuItem[] menuItems){this.menuItems = menuItems;}@Overridepublic boolean hasNext() {if(position >= menuItems.length || menuItems[position] == null){return false;}else {return true;}}@Overridepublic Object next() {MenuItem menuItem = menuItems[position];position += 1;return menuItem;}
}

Waitress 类

//服务员 通过菜单来输出菜单的价格
public class Waitress {BZMenu bzMenu;SXMenu sxMenu;public Waitress(BZMenu bzMenu, SXMenu sxMenu){this.bzMenu = bzMenu;this.sxMenu = sxMenu;}public void printMenu(){Iterator<MenuItem> iterator = bzMenu.createIterator();//菜单创建迭代器Iterator<MenuItem> iterator1 = sxMenu.createIterator();System.out.println("包子菜单为:");printMenu(iterator);    //传入迭代器进行遍历System.out.println("沙县菜单为:");printMenu(iterator1);}//传入相应菜单的迭代器  然后将会遍历   核心private void printMenu(Iterator iterator){while (iterator.hasNext()){MenuItem menuItem = (MenuItem) iterator.next();System.out.print(menuItem.getName() + ": ");System.out.println(menuItem.getPrice());}}

测试类

public class MenuTestDrive {public static void main(String[] args) {BZMenu bzMenu = new BZMenu();SXMenu sxMenu = new SXMenu();Waitress waitress = new Waitress(bzMenu,sxMenu);  waitress.printMenu();}
}/*** 输出* 包子菜单为:* 雪菜包: 1.0* 灌汤包: 1.0* 韭菜包: 1.0* 猪肉包: 1.0* 沙县菜单为:* 青椒肉丝盖浇饭: 10.0* 西红柿鸡蛋盖浇饭: 10.0* 牛肉土豆煲仔饭: 15.0* 金针菇煲仔饭: 10.0*/

2.4 问题总结

为了解决打印菜单的难题,我们新建了两个具体迭代器,分别用于遍历存储包子菜单的集合和存储沙县菜单的数组,在包子菜单和沙县菜单的类中提供外部可调用的遍历菜单的迭代器。这样一来,我们把遍历菜单的任务放在了具体迭代器类中,而不是具体聚合类中。外部不用知道其内部菜单是如何存储的,你只需要给外部提供一个迭代器对象,就能完成遍历菜单的任务。

三、 迭代器模式总结
3.1 迭代器模式优缺点总结

优点

  • 它支持以不同的方式遍历一个聚合对象。
  • 迭代器简化了聚合类。
  • 在同一个聚合上可以有多个遍历。
  • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点

对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐。

3.2 迭代器模式知识点总结

  • 迭代器允许访问聚合的元素,而不需要暴露它的内部结构。
  • 迭代器将遍历集合的任务封装进一个对象中。
  • 使用迭代器的时候,我们依赖聚合提供遍历。
  • 迭代器提供了一个通用的接口 (可以自定义也可以使用 Java API 内置的),让我们遍历聚合的项,当我们编码使用聚合的项时,可以考虑使用多态机制。

原文链接:https://blog.csdn.net/codejas/article/details/79186349

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

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

相关文章

3D设计云桌面

青椒云3D设计桌面云方案,为使用GPU高负载应用的设计师们提供强大支持,如3D建模、光线追踪、渲染计算等领域,带来极致流畅的3D设计桌面体验,同时提升工作效率、可管理性和安全性。3D设计桌面云方案满足了工业客户在专业设计场景中的以下需求 1、强大的图形计算引擎保证专业…

设计模式-建造者模式

设计模式-建造者模式 传统模式类JDK8的Builder 别名&#xff1a;创建者模式 建造者模式针对复杂对象&#xff0c;分离它们的构建与表示&#xff0c;达到同样构建过程创建不同表示的目的。 建造者模式封装了复杂对象的构建过程&#xff0c;通过子类继承或者重载的方式&#xff0…

设计模式---工厂模式

工厂模式 具体的需求 看一个披萨的项目&#xff1a;要便于披萨种类的扩展&#xff0c;要便于维护 披萨的种类很多&#xff08;比如 GreekPizz、CheesePizz 等&#xff09; 披萨的制作有 prepare、bake、cut、box 完成披萨店订购功能 public abstract class Pizza {protect…

浅谈设计模式

状态模式 核心思想就是用于解决一个物体在不同状态下复杂的逻辑行为&#xff0c;比如一个英雄有待机状态&#xff0c;行走状态&#xff0c;攻击状态&#xff0c;以后可能还会添加眩晕状态&#xff0c;冰冻状态一系列状态。 如果使用平常代码来写的话&#xff0c;就会使用分支语…

青椒开计算机课,不断学习 砥砺前行——揭开青椒成长的秘密

从上海到梧州&#xff0c;1700多公里&#xff1b;从2017年9月到今天&#xff0c;300多个日子。我们在互联网结缘&#xff0c;我们在互加遇见。于是&#xff0c;便开始了一路美丽的相伴&#xff0c;相伴在“互加”&#xff0c;相伴在“青椒”&#xff0c;相伴在“美丽乡村”………

了解计算机软件系统教学设计,认识计算机》教学设计

认识计算机》教学设计 作为一名教职工&#xff0c;就有可能用到教学设计&#xff0c;教学设计一般包括教学目标、教学重难点、教学方法、教学步骤与时间分配等环节。那么什么样的教学设计才是好的呢&#xff1f;以下是小编整理的认识计算机》教学设计&#xff0c;仅供参考&…

Java 设计模式——组合模式

概述 有时我们可能会被要求处理一个层级结构明显的对象&#xff0c;比如上下级的公司员工、比如层级嵌套的文件夹&#xff0c;还有丰富多彩的美食菜单。可是&#xff0c;我们可能要屡试不爽地编写深度搜索代码、要小心翼翼地编写递归逻辑。现在你可以忘掉这些&#xff0c;学习…

设计模式之模板方法模式

概述 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体的环境相关。 例如&#…

matlab 滤波器设计工具,滤波器设计工具快速入门

滤波器设计工具快速入门 要打开滤波器设计工具,请键入 filterDesigner(在 MATLAB 命令提示符下键入。) 将打开滤波器设计工具并显示“设计滤波器”面板。 请注意,当您打开设计滤波器并未启用。您必须对默认滤波器设计进行更改以启用设计滤波器。每次您要更改滤波器设计时,均…

ChatGPT有用到知识图谱吗?| 文末送最新《知识图谱实战》书籍

文末留言点赞前五名送书&#xff0c;截止时间2023.4.2(本周日) 20:00 进NLP群—>加入NLP交流群(备注nips/emnlp/nlpcc进入对应投稿群) 从搜索引擎到个人助手&#xff0c;我们每天都在使用问答系统。问答系统必须能够访问相关的知识并进行推理。通常&#xff0c;知识可以隐式…

ChatGPT的诞生

这就是为什么ChatGPT 不可能在中国出现的原因 自欺欺人在家里玩可以&#xff0c;但是 你只是这世界的1/6而已&#xff0c;不可能 欺骗其他5/6的人类 最后还是自己傻比了

51 种 AI 工具,生活、编程、内容创建都应该使用它

AI 正在席卷全球 &#x1f525;&#x1f525;&#x1f525; 它具有无限的潜力&#xff0c;并将改变我们的生活&#xff0c;让生活变得更美好。这项技术将迅速改进&#xff0c;您今天可以使用许多工具来提高您的工作效率&#xff0c;帮助您完成工作&#xff0c;为您提供有关许多…

SpringBoot+Vue+Uniapp搭建的Java版本的ChatGPT智能Ai对话系统

chatgpt-java-system 介绍 SpringBootVueUniapp搭建的Java版本的ChatGPT智能Ai对话系统&#xff0c;小程序和H5包含智能Ai对话、精美Ai壁纸、知识付费商城、积分、会员、分享等公功能&#xff1b;后端管理包括系统管理、智能对话、基本设置、系统监控、代码生成、壁纸管理和商…

chatgpt赋能python:Python解决找零问题--极简演示

Python解决找零问题 – 极简演示 在日常生活中&#xff0c;我们经常需要进行找零计算。如果使用笔和纸来手动计算&#xff0c;则会浪费很多时间和精力。但是Python作为一种高级编程语言&#xff0c;可以轻松地解决这个问题&#xff0c;省去人工计算的烦恼。 什么是Python找零…

九龙证券|远离资本市场噪音的四种方法

我们都知道人是自我完成的群体&#xff0c;自我完成便是便是有方案有目的辅导自己的行为&#xff0c;目标或预期在很大程度上决定着人们的取得感&#xff0c;就好像以下公式所表现的相同&#xff1a;取得感所得/预期&#xff0c;那么股市中的预期是什么&#xff1f;怎么进行预期…

Redis漏洞导致ChatGPT重大故障,OpenAI公布技术细节

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;ChatGPT研究框架&#xff08;80页PPT&#xff0c;附下载&#xff09;…

ChatGPT4 给出数据库开发者最容易犯的10个错误和解决方案

昨天 ChatGPT4 刚刚发布&#xff0c;迫不及待体验了一把。 ChatGPT 4 目前是付费使用&#xff0c;使用次数也有限制&#xff0c;门槛更高&#xff0c;API 调用费用是ChatGPT 3.5 的15倍&#xff0c;官网网站也经常登录不上。 我让 ChatGPT4 列举出【数据库开发者最容易犯的10个…

小白学习chatgpt

很明显&#xff0c;chatgpt的能力超出了人们过往对人工智能的认知&#xff0c;在使用过程中他的能力让我吃惊&#xff0c;而且具有通用性&#xff08;AGI&#xff09;&#xff0c;这一点在以往的人工智能中表现得比较少&#xff0c;具体在GPT-4的早期实验报告中有更多的说明。可…

解密Prompt系列8. 无需训练让LLM支持超长输入:知识库 unlimiformer PCW NBCE

这一章我们聊聊有哪些方案可以不用微调直接让大模型支持超长文本输入&#xff0c;注意这里主要针对无限输入场景。之前在BERT系列中我们就介绍过稀疏注意力和片段递归的一些长文本建模方案长文本建模 BigBird & Longformer & Reformer & Performer&#xff0c;不过…

3DTrans: 首个支持自动驾驶室外点云迁移学习的代码库

本文将为大家介绍上海人工智能实验室交通平台组ADLab的3DTrans代码库–首个自动驾驶室外3D点云迁移学习的代码库。此外3DTrans代码库还是Uni3D&#xff08;CVPR-2023&#xff09;和Bi3D&#xff08;CVPR-2023&#xff09;的官方实现代码库。 Code Link: https://github.com/PJ…