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

大话设计模式——24.迭代器模式(Iterator Pattern)

简介

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部实现。(Java中使用最多的设计模式之一)

UML图

在这里插入图片描述

应用场景
  • Java的集合对象:Collection、List、Map、Set等都有迭代器
  • Java ArrayList的迭代器源码
    在这里插入图片描述

示例

简单实现集合中的迭代器功能

  1. Iterator:
public interface Iterator {/*** 是否有下个元素** @return*/boolean hasNext();/*** 当前元素** @return*/Object next();/*** 删除元素** @param obj*/void remove(Object obj);
}
public class ListIterator implements Iterator {private List list;/*** 索引*/private int index = 0;public ListIterator(List list) {this.list = list;}@Overridepublic boolean hasNext() {return index != list.size();}@Overridepublic Object next() {Object obj = null;if (hasNext()) {obj = list.get(index);index++;}return obj;}@Overridepublic void remove(Object obj) {list.remove(obj);}
}
  1. Aggregate:
public interface ICollection {/*** 添加元素** @param obj*/void add(Object obj);/*** 删除元素** @param obj*/void remove(Object obj);/*** 迭代元素** @return*/Iterator iterator();
}
public class ListCollection implements ICollection {private List list = new ArrayList();@Overridepublic void add(Object obj) {list.add(obj);}@Overridepublic void remove(Object obj) {list.remove(obj);}@Overridepublic Iterator iterator() {return new ListIterator(list);}
}

3.运行

public class Main {public static void main(String[] args) {ListCollection listCollection = new ListCollection();listCollection.add("aaaaaa");listCollection.add("bbbbbb");listCollection.add("cccccc");listCollection.add("dddddd");// 创建迭代器Iterator iterator = listCollection.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

在这里插入图片描述

总结

  • 优点

    • 可以不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据
    • 支持以不同的方式遍历一个聚合对象
  • 缺点

    • 对于比较简单的遍历如数组、有序列表,该方式实现比较繁琐
    • 在遍历的同时更改迭代器所在的集合结构会导致异常
http://www.lryc.cn/news/336385.html

相关文章:

  • 【数据结构】双向链表 C++
  • 消息队列之-----------------zookeeper机制
  • 第十届蓝桥杯大赛个人赛省赛(软件类) CC++ 研究生组2.0
  • vscode开发ESP32问题记录
  • R语言复现:轨迹增长模型发表二区文章 | 潜变量模型系列(2)
  • 【数据结构】顺序表的实现——动态分配
  • 3.3.k8s搭建-rancher RKE2
  • CST电磁仿真软件的设置变更与问题【官方教程】
  • 保研线性代数复习3
  • 从零开始学Spring Boot系列-集成MyBatis-Plus
  • 【云原生篇】k8s之Deployment详解
  • linux安装dubboAdmin
  • Android 系统编译 and 应用裁剪
  • java数组.day16(冒泡排序,稀疏数组)
  • vue+springboot多角色登录
  • 使用 ADB 查找应用名称和活动名称,并启动指定页面
  • LangChain - 文档转换
  • 【C++】STL--list
  • 二. CUDA编程入门-双线性插值计算
  • 实时计算平台设计方案:913-基于100G光口的DSP+FPGA实时计算平台
  • Glide系列-自定义ModuleLoader
  • 设计模式——责任链模式13
  • Linux云计算之Linux基础3——Linux系统基础part-2
  • HBase详解(2)
  • Web后端搭建
  • k8s单节点部署,容器运行时使用containerd
  • 深入浅出 -- 系统架构之性能优化的核心思维
  • Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
  • 批量删除文件脚本
  • 蓝桥杯物联网竞赛_STM32L071KBU6_我的全部省赛及历年模拟赛源码