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

设计模式-行为型模式-迭代器模式

1.迭代器模式的定义

        迭代器模式提供一种对容器对象中的各个元素进行访问的方法,而不需要暴露该对象的内部细节;

        在软件系统中,容器对象有两个职责:一是存储数据,二是遍历数据;从依赖性上看,前者是基本职责,而后者是可以变化的,又是可以分离的,因此可以将遍历数据的行为从容器中抽取出来,封装到迭代器对象中,由迭代器来提供遍历数据的行为,这将简化聚合对象的设计,更加符合单一职责原则;

        对于迭代器模式,设计时很少用到,但编码时经常用到,目前大多数编程语言中,迭代器已经成为一个基础的类库,直接能用来遍历集合对象;

1.1 迭代器模式的优缺点

优点

  • 迭代器模式支持以不同方式遍历一个集合对象,在同一个集合对象上可以定义多种遍历方式,在迭代器模式中只需要用一个不同的迭代器来替换原有的迭代器,即可改变遍历算法,也可以自己定义迭代器的子类以支持新的遍历方式;
  • 迭代器简化了集合类,原有的集合对象不需要再自行提供数据遍历等方法;
  • 由于引入了抽象层,增加新的集合类和迭代器类都很方便,无需修改原有代码,满足基于接口编程而非实现和开闭原则;

缺点

  • 由于迭代器模式将存储数据和遍历数据的职责分离,增加了类的个数,增加了系统的复杂性;
  • 抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展;

1.2 迭代器模式的使用场景

  • 减少程序中重复的遍历代码;
  • 当需要为遍历不同的集合结构提供一个统一的接口时或当访问一个集合对象的内容而无需暴露其内部细节时;

2.迭代器模式的原理

  • 抽象集合类(Aggregate):用于存储和管理元素对象,定义存储、添加、删除集合的功能,并且声明了一个 createIterator() 方法用于创建迭代器对象;
  • 具体集合类(ConcreteAggregate):实现抽象集合类,返回一个具体迭代器的实例;
  • 抽象迭代器类(Interator):定义访问和遍历集合元素的接口,通常包含 hasNext()、next() 等方法;
  • 具体迭代器类(ConcreteIterator):实现抽象迭代器接口所定义的方法,完成对集合对象的遍历,同时记录遍历的当前位置;

3.迭代器模式的实现

【代码】

        抽象迭代器

public interface IteratorIterator<E> {void reset();   //重置为第一个元素E next();   //获取下一个元素E currentItem();    //检索当前元素boolean hasNext();  //判断是否还有下一个元素存在
}

        抽象集合

public interface ListList<E> {//获取迭代器对象的抽象方法(面向接口编程)IteratorIterator<E> Iterator();
}

        具体迭代器

public class TopicIterator implements IteratorIterator<Topic> {//Topic数组private Topic[] topics;//记录存储位置private int position;public TopicIterator(Topic[] topics) {this.topics = topics;position = 0;}@Overridepublic void reset() {position = 0;}@Overridepublic Topic next() {return topics[position++];}@Overridepublic Topic currentItem() {return topics[position];}@Overridepublic boolean hasNext() {if(position >= topics.length){return false;}return true;}
}

        抽象迭代器

public class TopicList implements ListList<Topic> {private Topic[] topics;public TopicList(Topic[] topics) {this.topics = topics;}@Overridepublic IteratorIterator<Topic> Iterator() {return new TopicIterator(topics);}
}

        客户端

public class Client {public static void main(String[] args) {Topic[] topics = new Topic[4];topics[0] = new Topic("topic1");topics[1] = new Topic("topic2");topics[2] = new Topic("topic3");topics[3] = new Topic("topic4");TopicList topicList = new TopicList(topics);IteratorIterator<Topic> iterator = topicList.Iterator();while(iterator.hasNext()){Topic t = iterator.next();System.out.println(t.getName());}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【秋招笔试】9.07美团秋招改编题(研发岗)
  • 【2024高教社杯国赛A题】数学建模国赛建模过程+完整代码论文全解全析
  • 纳米材料咋设计?蛋白质模块咋用?看这里就知道啦!
  • 数学建模_缺失值处理_拉格朗日、牛顿插值(全)
  • Android流式接口请求实践
  • 设计模式学习-责任链模式
  • JVM系列(十) -垃圾收集器介绍
  • 【阿里云】个人认证与公司认证
  • 目标检测-YOLOv10
  • VMEMMAP分析
  • [阅读笔记]《解读基金—我的投资观与实践》— 季凯帆
  • windows下安装elasticSearch和kibana
  • C++——list的实现
  • 部署若依Spring boot项目
  • 【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染
  • 网络传输文件的问题
  • Android Volley源码解析
  • session共享问题解决方案
  • SOFAMosn配置模型
  • Vue2 SSR 的优化之旅
  • 关于extract.autodesk.io的一些说明
  • 今年的LC3大会没了?
  • 经典排序算法及其 Java 实现
  • 精彩代码 vue.js
  • 如何学习JavaEE,项目又该如何做?
  • 实习面试笔记
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​secrets --- 生成管理密码的安全随机数​
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​数据链路层——流量控制可靠传输机制 ​
  • ###C语言程序设计-----C语言学习(6)#
  • #ifdef 的技巧用法
  • (1)svelte 教程:hello world
  • (31)对象的克隆
  • (4)logging(日志模块)
  • (52)只出现一次的数字III
  • (Java数据结构)ArrayList
  • (SpringBoot)第二章:Spring创建和使用
  • (第30天)二叉树阶段总结
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (分类)KNN算法- 参数调优
  • (过滤器)Filter和(监听器)listener
  • (七)Flink Watermark
  • (十八)Flink CEP 详解
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转)我也是一只IT小小鸟
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET MVC第五章、模型绑定获取表单数据
  • .Net 代码性能 - (1)
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET/C# 的字符串暂存池
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .sys文件乱码_python vscode输出乱码