设计模式-迭代器

文章目录

  • 1. 引言
    • 1.1 概述
    • 1.2 设计模式
    • 1.3 迭代器模式的应用场景
    • 1.4 迭代器模式的作用
  • 2. 基本概念
    • 2.1 迭代器 Iterator
    • 2.2 聚合 Aggregate
    • 2.3 具体聚合 ConcreteAggregate
  • 3. Java 实现迭代器模式
    • 3.1 Java 集合框架
    • 3.2 Java 迭代器接口
    • 3.3 Java 迭代器模式实现示例
  • 4. 迭代器模式的优缺点
    • 4.1 优点
    • 4.2 缺点
  • 5. 迭代器模式和其他设计模式的关系
    • 5.1 迭代器模式和工厂模式
    • 5.2 迭代器模式和组合模式
    • 5.3 迭代器模式和模板方法模式
  • 6. 总结
    • 6.1 迭代器模式的应用场景
    • 6.2 迭代器模式与其他设计模式的关系
    • 6.3 迭代器模式的优缺点

1. 引言

1.1 概述

迭代器模式是一种行为型设计模式,它允许客户端逐个访问聚合对象中的元素,而不用暴露聚合对象的内部表示。

1.2 设计模式

设计模式是解决特定问题的经过验证的最佳实践,它提供了一种通用的解决方案,可以在不同的场景下重复使用。

1.3 迭代器模式的应用场景

迭代器模式通常在需要遍历一个聚合对象中的元素,并且不想暴露其内部结构时使用。例如,Java 中的集合框架就使用了迭代器模式来遍历集合中的元素。
在这里插入图片描述

1.4 迭代器模式的作用

迭代器模式的主要作用是将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,同时也可以提供多种遍历方式。

2. 基本概念

2.1 迭代器 Iterator

迭代器是一个接口,定义了访问和遍历聚合对象元素的方法。迭代器提供了一种统一的访问方式,使得客户端可以不依赖聚合对象的具体类型和内部结构,而直接访问其中的元素。

2.2 聚合 Aggregate

聚合是一个接口,表示一个集合对象。聚合对象通常包含多个元素,可以提供多种访问方法,例如获取某个元素、添加和删除元素等。

2.3 具体聚合 ConcreteAggregate

具体聚合是聚合的具体实现,它实现了聚合接口,并且维护了内部元素的数据结构,例如数组、链表、栈、队列等。

3. Java 实现迭代器模式

3.1 Java 集合框架

Java 集合框架是一组用于存储和操作元素的类和接口。集合框架提供了多种数据结构和算法,可以满足不同场景下的需求。Java 集合框架中的所有集合类都实现了 Iterable 接口,因此都可以使用迭代器进行遍历操作。

3.2 Java 迭代器接口

Java 提供了一个迭代器接口 Iterator,定义了访问和遍历集合中元素的方法。迭代器接口包含多个方法,例如 hasNext()、next()、remove() 等。

以下是迭代器接口的定义:

public interface Iterator<E> {boolean hasNext();E next();void remove();
}

3.3 Java 迭代器模式实现示例

以下是一个使用迭代器模式的简单示例,通过实现 Iterable 和 Iterator 接口,在不暴露内部结构的情况下遍历聚合对象中的元素。

import java.util.Iterator;public class MyCollection<T> implements Iterable<T> {private T[] elements;private int size;public MyCollection(T[] elements) {this.elements = elements;this.size = elements.length;}@Overridepublic Iterator<T> iterator() {return new MyIterator();}private class MyIterator implements Iterator<T> {private int index;public MyIterator() {this.index = 0;}@Overridepublic boolean hasNext() {return index < size;}@Overridepublic T next() {return elements[index++];}@Overridepublic void remove() {throw new UnsupportedOperationException();}}
}
public class Client {public static void main(String[] args) {String[] names = {"Alice", "Bob", "Charlie", "Dave"};MyCollection<String> collection = new MyCollection<>(names);Iterator<String> iterator = collection.iterator();while (iterator.hasNext()) {String name = iterator.next();System.out.println(name);}}
}

在上述代码中,MyCollection 实现了 Iterable 接口,并且返回一个实现了 Iterator 接口的内部类 MyIterator。MyIterator 中维护了一个 index 变量,表示当前遍历到的元素位置,hasNext() 方法用于判断是否还有下一个元素,next() 方法用于返回当前元素并将 index 加一。
在这里插入图片描述

4. 迭代器模式的优缺点

4.1 优点

  • 将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,遍历过程不会受到影响。
  • 提供了多种遍历方式,客户端可以根据自己的需求选择合适的遍历方式。
  • 对于不同类型的聚合对象,都可以提供统一的访问方式,使得客户端编码更加简单。

4.2 缺点

  • 对于某些聚合对象,如果其内部结构发生变化,可能会导致迭代器失效,需要重新创建新的迭代器。

5. 迭代器模式和其他设计模式的关系

5.1 迭代器模式和工厂模式

迭代器模式和工厂模式可以相互配合使用。在工厂模式中,可以使用迭代器遍历某个产品对象中的元素,实现对产品的全面访问。

5.2 迭代器模式和组合模式

迭代器模式和组合模式可以相互配合使用。在组合模式中,可以使用迭代器遍历整个组合结构中的所有元素,实现对组合结构的遍历和访问。

5.3 迭代器模式和模板方法模式

迭代器模式和模板方法模式也可以相互配合使用。在模板方法模式中,可以将迭代器作为模板方法的一部分,实现对聚合对象中元素的遍历和访问。

6. 总结

6.1 迭代器模式的应用场景

迭代器模式通常在需要遍历一个聚合对象中的元素,并且不想暴露其内部结构时使用。例如,Java 中的集合框架就使用了迭代器模式来遍历集合中的元素。

6.2 迭代器模式与其他设计模式的关系

迭代器模式和工厂模式、组合模式、模板方法模式等其他设计模式可以相互配合使用,实现更加灵活的编程。

6.3 迭代器模式的优缺点

迭代器模式的主要优点是将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,同时也可以提供多种遍历方式。其缺点是对于某些聚合对象,如果其内部结构发生变化,可能会导致迭代器失效,需要重新创建新的迭代器。

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

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

相关文章

ElasticSearch(一)数据类型

ElasticSearch&#xff08;一&#xff09;数据类型 1.简述 Es数据类型分为基础数据类型和复杂类型数据&#xff0c;掌握ES数据类型才能进一步使用ES检索数据内容。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

【python爬虫】10.指挥浏览器自动工作(selenium)

文章目录 前言selenium是什么怎么用设置浏览器引擎获取数据解析与提取数据自动操作浏览器 实操运用确认目标分析过程代码实现 本关总结 前言 上一关&#xff0c;我们认识了cookies和session。 分别学习了它们的用法&#xff0c;以及区别。 还做了一个项目&#xff1a;带着小…

身份识别与鉴权技术调研方案

对称加密算法 对称加密方式又称为私钥加密方式&#xff0c;该方式的加密和解密过程使用同一个密钥&#xff0c;因此该密钥又称为共享密钥。如图2.2所示&#xff0c;在对称加密方式中&#xff0c;发送方使用对称加密算法和共享密钥处理原始数据&#xff0c;得到一个加密后的密文…

Navicat使用HTTP通道服务器进行连接mysql数据库(超简单三分钟完成),centos安装nginx和php,docker安装nginx+php合并版

序言 因为数据库服务器在外网是不能直接连接访问的&#xff0c;但是可以访问网站&#xff0c;网站后台就能访问数据库&#xff0c;所以在此之前&#xff0c;访问数据库的数据是一件非常麻烦的事情&#xff0c;在平时和运维的交流中发现&#xff0c;他们会使用ssh通道进行连接访…

博客系统后台前端UI设计

效果展示 API编写 index.js import axios from "./request"const fastdfs {delete: file/fastdfs/delete } const permission {search: "/sys/permission/search",add: "/sys/permission/add",update: "/sys/permission/update",d…

Python Tcp编程

网络连接与通信是我们学习任何编程语言都绕不过的知识点。Python 也不例外&#xff0c;本文就介绍因特网的核心协议 TCP &#xff0c;以及如何用 Python 实现 TCP 的连接与通信。 TCP 协议 TCP协议&#xff08;Transmission Control Protocol&#xff0c; 传输控制协议&#…

微信小程序左上角home图标的解决方法之一 层级混乱导致的home图标显示的问题 自定义左上角左侧图标的返回路径

这个项目的编辑页在tabbar上 导致跳到tabbar得使用wx.switchTab 保存后返回原来的页面就出现了左上角的home图标 本来想通过自定义home图标的跳转路径来解决这个问题 没想到居然找不到相关内容 有清楚的朋友麻烦给我留个言不胜感激 那我写一下我的骚操作 app.js globalData: {…

Git学习——细节补充

Git学习——细节补充 1. git diff2. git log3. git reset4. git reflog5. 提交撤销5.1 当你改乱了工作区某个文件的内容&#xff0c;想直接丢弃工作区的修改时5.2 当提交到了stage区后&#xff0c;想要退回 6. git remote7. git pull origin master --no-rebase8. 分支管理9. g…

【计算机网络】序列化与反序列化

文章目录 1. 如何处理结构化数据&#xff1f;序列化 与 反序列化 2. 实现网络版计算器1. Tcp 套接字的封装——sock.hpp创建套接字——Socket绑定——Bind将套接字设置为监听状态——Listen获取连接——Accept发起连接——Connect 2. 服务器的实现 ——TcpServer.hpp初始化启动…

uniapp 微信小程序 获取用户头像和昵称

一、背景 自2022年10月25日后&#xff0c;小程序 wx.getUserProfile 接口 被收回&#xff0c;通过 wx.getUserInfo 接口获取用户头像将统一返回默认灰色头像&#xff0c;昵称将统一返回 “微信用户”。如需获取用户头像昵称&#xff0c;可以手动获取&#xff0c;具体步骤&…

微信 小程序 在电脑PC端无法加载的解决办法。电脑微信小程序打不开是怎么回事?电脑微信小程序不能打开解决方法教学

一、电脑微信小程序打不开或者一直在加载的原因&#xff1f; 1、电脑端微信版本未更新 微信版本未及时更新&#xff0c;也会影响小程序的正常打开&#xff0c;可以尝试更新版本。 2、缓存过多 如果电脑缓存文件过多&#xff0c;内存少&#xff0c;也可能导致小程序无法流畅…

Java-Optional类

概述 Optional是JAVA 8引入的一个类&#xff0c;用于处理可能为null的值。 利用Optional可以减少代码中if-else的判断逻辑&#xff0c;增加代码的可读性。且可以减少空指针异常的发生&#xff0c;增加代码的安全性。 常用的方法 示例 代码 public class OptionalTest {pub…