【设计模式】第十六章:迭代器模式详解及应用案例

news2024/12/23 10:46:26

系列文章

【设计模式】七大设计原则
【设计模式】第一章:单例模式
【设计模式】第二章:工厂模式
【设计模式】第三章:建造者模式
【设计模式】第四章:原型模式
【设计模式】第五章:适配器模式
【设计模式】第六章:装饰器模式
【设计模式】第七章:代理模式
【设计模式】第八章:桥接模式
【设计模式】第九章:外观模式 / 门面模式
【设计模式】第十章:组合模式
【设计模式】第十一章:享元模式
【设计模式】第十二章:观察者模式
【设计模式】第十三章:模板方法模式
【设计模式】第十四章:策略模式
【设计模式】第十五章:责任链模式
【设计模式】第十六章:迭代器模式
【设计模式】第十七章:状态模式
【设计模式】第十八章:备忘录模式
【设计模式】第十九章:访问者模式
【设计模式】第二十章:解释器模式
【设计模式】第二十一章:命令模式
【设计模式】第二十二章:中介者模式


文章目录

  • 系列文章
  • 一、定义
  • 二、角色分类
  • 三、实现方式
    • UML图
    • 具体实现
  • 四、应用场景
  • 五、优缺点
    • 优点
    • 缺点


一、定义

摘自百度百科: 提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。


二、角色分类

抽象迭代器(Iterator)

定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法

具体迭代器(Concrete Iterator)

实现了抽象迭代器,完成遍历数据元素的具体实现方法,同时在迭代器中通过游标来记录在聚合对象中当前的所处位置,游标通常是一个非负整数

抽象聚合类(Aggregate)

用于存储和管理元素对象,声明了创建迭代器对象的方法,充当抽象迭代器工厂使用

具体聚合类(Concrete Aggregate)

实现了抽象聚合类中声明的创建迭代器对象的方法,该方法返回一个于该具体聚合类对应的具体迭代器实例

客户角色(Client)

具体调用方法的角色


三、实现方式

UML图

未命名文件 (2).png

具体实现

假如我们有一个场景为:医院看病时需要挂号,按照挂号号码来看病,就可以使用迭代器模式实现

/**
 * 病号实体类
 */
@Data
@ToString
public class Patient {

  /**
   * 病人姓名
   */
  private String name;

  /**
   * 挂号号码
   */
  private Integer number;

  public Patient(String name, Integer number) {
    this.name = name;
    this.number = number;
  }

  public void diagnosis() {
    System.out.println("医生你好,我是第" + this.number + "号病人" + this.name)
  }
}

抽象聚合类(Aggregate)

public interface Aggregate {
  
  void addPatient(Patient patient);

  void removePatient(Patient patient);

  PatientIterator createPatientIterator();
}

具体聚合类(Concrete Aggregate)

public class ConcreteAggregate implements Aggregate {
  // 病人列表
  private List<Patient> list;

  public ConcreteAggregate() {
    this.list = new ArrayList<>();
  }

  @Override
  public void addPatient(Patient patient) {
    this.list.add(patient);
  }

  @Override
  public void removePatient(Patient patient) {
    this,list.remove(patient);
  }

  @Override
  public PatientIterator createPatientIterator() {
    return new ConcreteIterator(this.list);
  }
}

抽象迭代器(Iterator)

public interface Iterator {
  boolean hasNext();

  Patient next();
}

具体迭代器(Concrete Iterator)

public class ConcreteIterator implements Iterator {
  private List<Patient> list;
  private int position = 0;
  private Patient currentPatient;

  public ConcreteIterator(List<Patient> list) {
    this.list = list;
  }

  @Override
  public boolean hasNext() {
    return position < list.size;
  }

  @Override
  public Patient next(){
    currentPatient = list.get(position);
    position++;
    return currentPatient;
  }
}

客户角色(Client)

public class Client {
  public static void main(String[] args) {
    Aggregate doctorA = new ConcreteAggregate();
    doctorA.addPatient(new Patient("张三", 1));
    doctorA.addPatient(new Patient("李四", 2));
    doctorA.addPatient(new Patient("王五", 3));
    doctorA.addPatient(new Patient("赵六", 4));

    Iterator iterator = doctorA.createPatientIterator();
    while (iterator.hasNext()) {
      Patient patient = iterator.next();
      patient.diagnosis();
    }
  }
}

运行结果

医生你好,我是第1号病人张三
医生你好,我是第2号病人李四
医生你好,我是第3号病人王五
医生你好,我是第4号病人赵六

四、应用场景

以下部分内容摘自菜鸟教程

意图: 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

主要解决: 不同的方式来遍历整个整合对象。

何时使用: 遍历一个聚合对象。

如何解决: 把在元素之间游走的责任交给迭代器,而不是聚合对象。

关键代码: 定义接口:hasNext, next。

应用实例: JAVA 中的 iterator。

使用场景:

  1. 访问一个聚合对象的内容而无须暴露它的内部表示。
  2. 需要为聚合对象提供多种遍历方式。
  3. 为遍历不同的聚合结构提供一个统一的接口。

注意事项: 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。


五、优缺点

优点

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

缺点

由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

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

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

相关文章

2023 年 最全的 24 个最佳免费照片恢复软件

你的心脏停止跳动&#xff0c;你的胃下沉。你的血液变冷了。你无法屏住呼吸。这是恐慌和怀疑的结合。如果您曾经丢失过数字文件&#xff0c;这种感觉很熟悉。 也许您不小心删除了照片。或者某些文件可能只是消失了。不管发生什么&#xff0c;都是令人心碎的。 不过&#xff0…

2023年27个最佳WordPress博客和新闻杂志主题

当建设杂志和新闻网站时&#xff0c;WordPress是首选。 纽约时报、TechCrunch、CNN、路透社、Mozilla 博客等知名新闻网站以及许多其他网站都使用 WordPress 作为他们的首选平台&#xff0c;突出了WordPress杂志主题的可扩展性。 在一个年轻受众与新闻品牌的联系明显较弱的世…

K8S出错bash: _get_comp_words_by_ref: command not found

重新配置了CentOS环境&#xff0c;执行kubectl apply -f xxx.yaml&#xff0c;想自动补全文件名&#xff0c;遇到错误&#xff1a;bash: _get_comp_words_by_ref: command not found 但是试验其它bash自动补全功能&#xff0c;没问题&#xff0c;比如cd 某个目录自动补全&#…

SAP BDC 录屏及 ABAP 调用 BDC

1:输入事务代码&#xff1a;SHDB.点击新建记录。 输入记录名和需要录屏的事务代码。 开始记录后会进入事务代码点击返回后会记录下操作过程。 点击程序按钮&#xff0c;生成可以调用的代码。 代码如下&#xff1a; report ZTEST_APPLICTIONno standard page heading line-size…

2-Spring cloud之Eureka快速剔除失效服务

2-Spring cloud之Eureka快速剔除失效服务 1. eureka server端修改yml配置2. 客户端配置 1. eureka server端修改yml配置 添加如下配置&#xff1a; server:enable-self-preservation: false # 关闭自我保护eviction-interval-timer-in-ms: 3000 # 清理间隔(剔除失效服务…

骨传导耳机音质怎么样,推荐几款音质表现不错的骨传导耳机

最近体验了几款骨传导耳机&#xff0c;分享下我的使用感受。首先说一下为什么要选择骨传导耳机&#xff0c;我之前是使用入耳式耳机&#xff0c;戴久了耳朵会疼&#xff0c;而且晚上睡觉不能戴。于是就考虑骨传导耳机&#xff0c;因为骨传导耳机在传声的过程中不需要经过耳膜&a…

界面控件KendoReact PivotGrid组件,开启交互式数据探索新方式!

数据透视表将数据网格的功能与图形和图表的显示结合起来&#xff0c;允许用户以交互式的方式探索数据&#xff0c;今天将带大家一起学习如何开始使用KendoReact PivotGrid组件&#xff01; Kendo UI致力于新的开发&#xff0c;来满足不断变化的需求&#xff0c;通过React框架的…

gRPC远程调用服务端与客户端连接详解

proto插件生成文件 参考之前的文章构建一个grpc实例&#xff0c;初步认识gprcgRPC教程与应用。 首先早gprc中下载了protoc插件&#xff0c;然后编写了.proto配置文件&#xff0c;通过插件生成了xxx.pb.go和xxx_gprc.pb.go两个文件。前者是rpc服务器请求和响应参数的定义&…

[ZJCTF 2019]NiZhuanSiWei1

拿到是一段php代码 <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"]; if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf")){echo "<br><h1>&quo…

【高端设计】DDR4设计方法与仿真分析(一)

本文主要介绍了DDR4设计方法与仿真分析&#xff0c;并示范SIwave如何做DDR4的瞬时眼图、SSN、on-die de-cap影响、DBI耗电分析与规范性测试。 1.DDR4和DDR3的区别 1.1 DDR4传输速度与带宽增加 DDR3 1600/1866MHz -> DDR4 1866/3200MHz DDR3采用多点分支单流架构&#xff…

【电路原理学习笔记】第2章:电压、电流和电阻:2.7基本电路的测量

第2章&#xff1a;电压、电流和电阻 2.7基本电路的测量 用来测量电压的仪器是电压表&#xff0c;用来测量电流的仪器是电流表&#xff0c;用来测量电阻的仪器是欧姆表。通常&#xff0c;这3种仪器被集成到一个称为万用表的仪器中。在万用表中&#xff0c;可以通过开关选择特定…

Python接收摄像头输出的YCbYCr数据并显示图像(附Python源码)

前言 摄像头用的OV的2640&#xff0c;输出YCbYcr的十六进制数据&#xff0c;数据保存成字符串形式的hex文件&#xff0c;之后用Python读取文件&#xff0c;并显示图片。 文章先搭建Python环境&#xff0c;之后编程实现十六进制数据显示图片的功能。 十六进制文件格式如下图&am…

el-table合计样式修改,增加图片

这里的表格用的是el-table组件。如上图&#xff0c;在底部合计的两个字段上增加图片。合计用的是:summary-method"getSummaries"。增加图片的原理其实就是获取这个单元格的dom元素定位&#xff0c;然后在这个元素里面增加 img元素&#xff0c;还可以设置样式。如下图…

Django之常用组件

一、分页器组件 class Pagination(object):def __init__(self,current_page,all_count,per_page_num2,pager_count11):"""封装分页相关数据:param current_page: 当前页:param all_count: 数据库中的数据总条数:param per_page_num: 每页显示的数据条数:par…

峰会来袭 | CAD模型转换工具选择的难点和关键点解答

作为世界顶尖的3D软件开发SDK和CAD模型转换工具——HOOPS Exchange已问世十多年&#xff0c;深受开发者好评&#xff0c;并在工业测量、机械加工、造船设计等领域都有广泛的应用。 本次峰会将围绕CAD软件造型技术的多样性、CAD模型数据解析的难点、3D模型转换的经典问题等&…

曝光调整和曝光融合论文粗读

曝光调整论文调研 M. Afifi, K. G. Derpanis, B. Ommer and M. S. Brown, “Learning Multi-Scale Photo Exposure Correction,” 2021 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), Nashville, TN, USA, 2021, pp. 9153-9163, doi: 10.1109/CVPR4…

开放式耳机什么牌子性价比好,这些高颜值蓝牙耳机分享给你

入耳式耳机在运动过程中会与耳道产生摩擦&#xff0c;产生咀嚼音、摩擦音等杂音&#xff0c;会让耳朵难受&#xff0c;听音也会受到影响&#xff0c;特别是像边看电视剧边吃零食等情况&#xff0c;会很影响体验感&#xff0c;所以开放式耳机不入耳的设计完全处理了这一问题&…

卷积神经网络| 猫狗系列【AlexNet】

首先&#xff0c;搭建网络&#xff1a; AlexNet神经网络原理图&#xff1a; net代码&#xff1a;【根据网络图来搭建网络&#xff0c;不会的看看相关视频会好理解一些】 import torchfrom torch import nnimport torch.nn.functional as Fclass MyAlexNet(nn.Module): def…

Linux系统之neofetch工具的基本使用

Linux系统之neofetch工具的基本使用 一、neofetch工具介绍1.1 neofetch简介1.2 neofetch特点 二、检查本地环境2.1 检查操作系统版本2.2 检查内核版本 三、安装neofetch工具3.1 配置yum仓库3.2 安装neofetch3.3 查看neofetch版本 四、neofetch工具的基本使用4.1 直接使用neofet…

quilt data-Working with the Catalog

Quilt Catalog 是 Quilt 的第二部分。它提供了一个在您的 S3 存储桶上的界面&#xff0c;将 Quilt 的数据包和搜索等功能带到了 Web 界面上。 请注意&#xff0c;您可以在不使用 Quilt Catalog 的情况下使用 Quilt Python API&#xff0c;但它们是设计为配合使用的。 简要介绍…