当前位置: 首页 > news >正文

【设计模式-迭代】

定义

迭代器模式(Iterator Pattern)是一种行为型设计模式,用于提供一种顺序访问集合对象元素的方式,而不暴露该对象的内部表示。通过迭代器,客户端可以在不需要了解集合实现的细节的情况下遍历集合中的元素。

UML图

在这里插入图片描述
角色

  • Iterator(迭代器接口):定义了访问和遍历集合元素的方法,如 next()、hasNext() 等。
  • ConcreteIterator(具体迭代器):实现迭代器接口,维护对集合的引用,并提供遍历集合的具体逻辑。
  • Aggregate(聚合接口):定义创建迭代器的接口,通常有一个方法返回一个迭代器实例。
  • ConcreteAggregate(具体聚合类):实现聚合接口,维护集合的内部数据结构,并提供创建具体迭代器的方法。

流程

  1. 客户端请求聚合对象的迭代器。
  2. 迭代器返回一个具体的迭代器实例,客户端使用该迭代器访问集合元素。
  3. 迭代器提供的方法用于遍历集合,不需要客户端了解集合的具体实现。

代码

import java.util.ArrayList;
import java.util.List;// 迭代器接口
interface Iterator<T> {boolean hasNext();T next();
}// 聚合接口
interface Aggregate<T> {Iterator<T> createIterator();
}// 具体迭代器
class ConcreteIterator<T> implements Iterator<T> {private List<T> items;private int position = 0;public ConcreteIterator(List<T> items) {this.items = items;}@Overridepublic boolean hasNext() {return position < items.size();}@Overridepublic T next() {return hasNext() ? items.get(position++) : null;}
}// 具体聚合类
class ConcreteAggregate<T> implements Aggregate<T> {private List<T> items = new ArrayList<>();public void addItem(T item) {items.add(item);}@Overridepublic Iterator<T> createIterator() {return new ConcreteIterator<>(items);}
}// 测试迭代器模式
public class IteratorPatternDemo {public static void main(String[] args) {ConcreteAggregate<String> aggregate = new ConcreteAggregate<>();aggregate.addItem("Item 1");aggregate.addItem("Item 2");aggregate.addItem("Item 3");Iterator<String> iterator = aggregate.createIterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

优点

  • 解耦:客户端与集合的内部表示解耦,客户端只需关注如何使用迭代器,而无需关心集合的具体实现。
  • 多种遍历方式:可以为同一集合提供多种不同的迭代器,支持不同的遍历策略。
  • 简化集合接口:将遍历功能抽象为迭代器,使集合接口更简单,关注于集合本身的操作。

缺点

  • 增加系统复杂性:引入迭代器模式会增加系统中的类数量,可能导致代码复杂性提高。
  • 性能开销:在某些情况下,使用迭代器可能引入额外的性能开销。

适用场景

  • 需要访问集合中的元素:如列表、集合、树等数据结构的遍历。
  • 不同遍历方式的需求:当同一集合需要多种遍历方式时,迭代器模式非常适用。
  • 对集合的封装:希望隐藏集合的内部结构,提供统一的访问接口时。
http://www.lryc.cn/news/450833.html

相关文章:

  • k8s搭建双主的mysql8集群---无坑
  • Iterm2配置主题和Oh-My-Zsh
  • html+css+js实现step进度条效果
  • OpenCV视频I/O(8)视频采集类VideoCapture之从视频源中读取一帧图像函数read()的使用
  • 深度学习500问——Chapter17:模型压缩及移动端部署(2)
  • 【C#】DllImport的使用
  • 基于 Redis 实现滑动窗口的限流
  • Camera Raw:打开图像
  • RK3588主板PCB设计学习(六)
  • 论文阅读(十一):CBAM: Convolutional Block Attention Module
  • 【Kubernetes】常见面试题汇总(四十八)
  • Qt Creator安卓环境配置【筑基篇】
  • 利用SpringBoot构建高效社区医院平台
  • 【C++ 前缀和 数论】1590. 使数组和能被 P 整除|2038
  • 外部引入的 JavaScript 放置位置
  • 【tbNick专享】虚拟机域控、成员服务器、降级等管理
  • Raspberry Pi3B+之Rpanion(gst)和ffmpeg验证
  • 数据结构编程实践20讲(Python版)—04队列
  • Ubuntu开机进入紧急模式处理
  • 解决无网条件下离线安装缺失的python包
  • 海外媒体投稿:如何运用3种国内外媒体套餐发稿突出重围?
  • Spring DI 笔记
  • psutil库的使用说明
  • PMP--三模--解题--71-80
  • iTextPDF 一个功能强大的 Java PDF 库
  • QT C++ 自学积累 『非技术文』
  • 浅谈虚拟内存(操作系统、Redis)
  • 【LeetCode HOT 100】详细题解之链表篇
  • 二叉树的递归遍历
  • 国内访问OpenAI API