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

设计模式 - 迭代器模式

目录

一. 前言

二. 实现

三. 优缺点


一. 前言

    迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。

二. 实现

Aggregate 是聚合类,其中 createIterator() 方法可以产生一个 Iterator;
ConcreteAggregate(具体聚合器):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
Iterator 主要定义了 hasNext() 和 next() 方法。
ConcreteIterator(具体迭代器):它是实现迭代器接口的具体实现类,负责具体的遍历逻辑。它保存了当前遍历的位置信息,并可以根据需要向前或向后遍历集合元素。
Client 组合了 Aggregate,为了迭代遍历 Aggregate,也需要组合 Iterator。

public interface Aggregate {Iterator createIterator();
}public class ConcreteAggregate implements Aggregate {private Integer[] items;public ConcreteAggregate() {items = new Integer[10];for (int i = 0; i < items.length; i++) {items[i] = i;}}@Overridepublic Iterator createIterator() {return new ConcreteIterator<Integer>(items);}
}
public interface Iterator<Item> {Item next();boolean hasNext();
}public class ConcreteIterator<Item> implements Iterator {private Item[] items;private int position = 0;public ConcreteIterator(Item[] items) {this.items = items;}@Overridepublic Object next() {return items[position++];}@Overridepublic boolean hasNext() {return position < items.length;}
}
public class Client {public static void main(String[] args) {Aggregate aggregate = new ConcreteAggregate();Iterator<Integer> iterator = aggregate.createIterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

三. 优缺点

优点:
1. 简化了集合类的接口,使用者可以更加简单地遍历集合对象,而不需要了解集合内部结构和实现细节。
2. 将集合和遍历操作解耦,使得我们可以更灵活地使用不同的迭代器来遍历同一个集合,根据需求选择不同的遍历方式。
3. 满足开闭原则,如果需要增加新的遍历方式,只需实现一个新的具体迭代器即可,不需要修改原先聚合对象的代码。
缺点:
1. 具体迭代器实现的算法对外不可见,因此不利于调试和维护。
2. 对于某些小型、简单的集合对象来说,使用迭代器模式可能会显得过于复杂,增加了代码的复杂性。

JDK中的迭代器
java.util.Iterator
java.util.Enumeration

http://www.lryc.cn/news/186514.html

相关文章:

  • Docker之Dockerfile搭建lnmp
  • 排序算法——选择排序
  • 【数据结构C/C++】双向链表的增删改查
  • Godot 添加Nuget 引用
  • IC工程师职场必备《经典Verilog100多个代码案例》(附下载)
  • springboot项目做成公共项目
  • RTC 时间、闹钟
  • 【yolo系列:yolov7训练添加spd-conv】
  • 面向对象设计-UML六种箭头含义
  • 一本没有任何数学公式的自然语言处理入门书
  • 【数据结构C/C++】多维数组的原理、访问方式以及作用
  • 2023年中国烹饪机器人市场发展概况分析:整体规模较小,市场仍处于培育期[图]
  • Android原生实现控件选择背景变色方案(API28及以上)
  • 为什么要学C语言及C语言存在的意义
  • 数据结构——空间复杂度
  • uniapp:swiper-demo效果
  • Graphviz 作图工具
  • vue、vuex状态管理、vuex的核心概念state状态
  • 【QT】Qt Application Manager启动应用源码分析
  • MyBatisPlus(十)判空查询
  • AIGC(生成式AI)试用 8 -- 曾经的难题
  • 文化主题公园旅游景点3d全景VR交互体验加深了他们对历史文化的认知和印象
  • 京东数据分析平台:2023年8月京东奶粉行业品牌销售排行榜
  • Java 21:虚拟线程介绍
  • Redis-缓存穿透,缓存击穿,缓存雪崩
  • 如何使用Docker实现分布式Web自动化!
  • 从零开始:制作出色的产品原型图的详细教程
  • 美国访问学者签证如何申请加急办理?
  • 33 WEB漏洞-逻辑越权之水平垂直越权全解
  • 【FreeRTOS】【STM32】02 FreeRTOS 移植