设计模式:迭代器模式

2023-09-17 16:22:25

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种访问聚合对象中各个元素的方法,而无需暴露聚合对象的内部表示。迭代器模式将遍历和操作聚合对象的责任分离,使得遍历算法可以独立于聚合对象变化而变化。
在迭代器模式中,聚合对象包含一个迭代器接口,定义了访问和遍历元素的方法。具体的聚合对象实现该接口,返回一个具体的迭代器对象。迭代器对象负责追踪聚合对象中的当前位置,并提供访问和操作元素的方法。
迭代器模式的核心思想是将遍历算法和聚合对象解耦,使得它们可以独立演化。这样可以提供多种不同的遍历方式,而无需修改聚合对象的结构。

组件

迭代器模式通常包含以下组件:

  1. 迭代器接口(Iterator Interface):定义了访问和遍历元素的方法,如获取下一个元素、判断是否还有下一个元素等。
  2. 具体迭代器(Concrete Iterator):实现了迭代器接口,负责追踪聚合对象中的当前位置,并提供访问和操作元素的方法。
  3. 聚合接口(Aggregate Interface):定义了创建迭代器对象的方法,如获取迭代器。
  4. 具体聚合类(Concrete Aggregate):实现了聚合接口,创建具体的迭代器对象。
  5. 客户端(Client):使用迭代器对象来遍历和访问聚合对象中的元素。
    迭代器模式中的关键组件是迭代器接口和具体迭代器,它们负责访问和遍历聚合对象中的元素。聚合接口和具体聚合类用于创建迭代器对象,并提供对聚合对象的访问。客户端使用迭代器对象来遍历和访问聚合对象中的元素,而无需了解聚合对象的内部表示。
    需要注意的是,以上是迭代器模式的一般组件,具体实现可能会根据应用场景的不同而有所变化。

代码示例

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

在上述示例中,我们定义了迭代器接口(Iterator)和聚合接口(Aggregate)。具体迭代器(ConcreteIterator)实现了迭代器接口,负责追踪聚合对象中的当前位置并提供访问元素的方法。具体聚合类(ConcreteAggregate)实现了聚合接口,创建具体的迭代器对象。在客户端代码中,我们创建了具体聚合对象,并使用迭代器对象来遍历和访问聚合对象中的元素。
这个示例展示了如何使用Java实现迭代器模式,通过迭代器对象来遍历和访问聚合对象中的元素,而无需了解聚合对象的内部表示。

源码中使用

迭代器模式在源码中有很多应用。以下是一些常见的源码中使用迭代器模式的情况:

  1. Java中的集合框架:Java的集合框架中,例如ArrayList、LinkedList等,都实现了迭代器模式。通过调用集合对象的 iterator() 方法,可以获取到对应的迭代器对象,用于遍历集合中的元素。
  2. JDBC中的结果集(ResultSet):JDBC中的结果集对象也实现了迭代器模式。通过调用结果集对象的 next() 方法,可以逐行遍历查询结果。
  3. Java中的IO流:Java中的IO流,如BufferedReader、Scanner等,也使用了迭代器模式。通过调用读取方法(如 readLine() )来逐行读取文件内容。
  4. Spring框架中的JdbcTemplate:Spring框架中的JdbcTemplate类使用迭代器模式来遍历查询结果集。通过调用 query() 方法,可以获取到结果集对象,然后使用迭代器来逐行处理查询结果。
    这些是迭代器模式在源码中的一些常见应用。迭代器模式通过提供一个统一的接口来遍历集合或者其他容器对象,使得客户端可以统一处理不同类型的容器对象。这样可以提高代码的可读性和可维护性,并且降低了与容器对象的耦合度。

优劣点

优点:

  1. 简化集合遍历:迭代器模式提供了一种统一的方式来遍历集合对象,无需暴露集合的内部结构,使得遍历操作更加简化和统一。
  2. 支持多种遍历方式:迭代器模式可以针对同一个集合对象实现多个不同的迭代器,每个迭代器可以提供不同的遍历方式,满足不同的需求。
  3. 隐藏集合实现细节:迭代器模式将集合的实现细节封装在迭代器中,使得客户端无需关注集合的内部结构,只需通过迭代器进行遍历操作。
  4. 支持并发访问:某些迭代器实现可以支持多线程并发访问,提供了线程安全的遍历操作。
    缺点:
  5. 增加了类的数量:引入迭代器模式会增加额外的迭代器类,增加了系统的复杂性和代码的维护成本。
  6. 遍历过程中的修改问题:如果在遍历过程中修改了集合对象,可能会导致迭代器的状态不一致,引发错误。
  7. 遍历效率问题:某些迭代器实现可能会影响遍历的效率,特别是在底层数据结构复杂的情况下。

总结

迭代器模式提供了一种简化和统一的方式来遍历集合对象,隐藏了集合的内部结构,提供了多种遍历方式。虽然引入了额外的类和复杂性,但它提供了灵活性和可维护性。在设计中,需要权衡迭代器模式的优点和缺点,确保合理使用。

更多推荐

ThreeJS-3D教学一基础场景创建

Three.js是一个开源的JS3D图形库,用于创建和展示高性能、交互式的3D图形场景。它建立在WebGL技术之上,并提供了丰富的功能和工具,使开发者可以轻松地构建令人惊叹的3D可视化效果。Three.js提供了一套完整的工具和API,用于创建和管理3D场景、几何体、纹理、光照、材质和相机等方面。它具有强大的渲染引擎,

分享一下蛋糕店在微信小程序上可以实现什么功能

蛋糕店在微信小程序上可以实现的功能微信小程序作为一种新型的商业模式,正逐渐成为各行各业拓展线上业务的重要手段。对于蛋糕店来说,开发微信小程序可以实现以下功能:一、展示产品和服务微信小程序可以作为蛋糕店的产品展示平台,展示店内的蛋糕品种、价格、口味、配料等信息。同时,小程序还可以提供预订服务,用户可以通过小程序提前预定蛋

Direct3D纹理映射

借助纹理映射技术,我们可将图像数据映射到三角形单元中,这种功能可以显著地增加所绘制场景的细节和真实感,例如创建一个立方体然后为其每个面映射一个板条纹理,从而将该立方体变为一个板条箱,在Direct3D中纹理用接口IDirect3DTexture9来表示,纹理是类似于表面的一个像素矩阵,与表面不同的是它可被映射到三角形单

如何在macOS上安装Go并搭建本地编程环境

引言Go是一种诞生于挫折中的编程语言。在谷歌,开发人员厌倦了在为新项目选择语言时必须做出权衡。有些语言执行效率很高,但需要很长时间编译,而另一些语言易于编写,但在生产环境中运行效率很低。因此,谷歌发明了Go语言,并设计了这门语言以拥有这一切:快速编译、快速执行、易于编写和易于部署。虽然Go是一种通用语言,可用于从web

zookeeper

先说Paxos,它是一个基于消息传递的一致性算法,LeslieLamport在1990年提出,近几年被广泛应用于分布式计算中,Google的Chubby,Apache的Zookeeper都是基于它的理论来实现的,pxos还被认为是到目前为1唯一的分布式一性算法,其它的算法都是Paxos的改进或简化。有个问题要提一下,P

arcgis拓扑检查实现多个矢量数据之间消除重叠区域

目录环境介绍:操作任务:步骤:1、数据库和文件结构准备2、建立拓扑规则3、一直下一页默认参数后,进行拓扑检查4、打开TP_CK_Topology,会自动带出拓扑要素,红色区域为拓扑错误的地方;5、编辑对应的图层,在编辑窗口选择:编辑器→更多编辑工具→拓扑。6、拓扑错误显示并处理7、最后对处理好的数据保存,导出即可8、操

绿源通过聆讯,两轮电动车“老江湖”,能否适应新时代?

作为两轮电动车领域历史最悠久的品牌之一,绿源的上市之路颇为波折。几次招股书失效后,绿源终于在9月19日成功通过港交所聆讯,跨过了这道门槛。此前,无论是招股书失效,还是在地方抽检中出现的不利新闻,都令外界认为,这个行业的内卷在催着绿源上市,获得更多博弈的资本。而从行业现实看,最重要的或许是两轮电动车的消费属性在不断变化,

相机HAL

相机HAL1、概览实现HAL2、相机HAL2.1AIDL相机HAL2.2相机HAL3功能2.3CameraHAL1概览相机HAL相机实现HALandroid12-release1、概览实现HALHAL位于相机驱动程序和更高级别的Android框架之间,它定义您必须实现的接口,以便应用可以正确地操作相机硬件。相机HAL的

从入局到破局:商家怎样挖掘视频号的新增量?

主笔:yolo出品:增长黑盒研究组在上一篇研究报告中,我们站在消费者的角度和市场大盘对视频号进行了分析,某种程度上是对于“终局”的展望:用户行为的变化、人群结构的变化等因素下,塑造除了视频号差异化的商业价值,为品牌提供了一个与用户建立深度关系的场景,因而存在可观的新增量空间。在本篇报告中,我们将视角切换回品牌和商家,看

什么是 AirServer?Mac专用投屏工具AirServer 7 .27 for Mac中文破解版百度网盘下载

AirServer7.27forMac中文免费激活版是一款Mac专用投屏工具,能够通过本地网络将音频、照片、视频以及支持AirPlay功能的第三方App,从iOS设备无线传送到Mac电脑的屏幕上,把Mac变成一个AirPlay终端的实用工具。目前最新的AirServer7.2.7版本,支持macOSHighSierra

NestJS 中的 gRPC 微服务通信

想象一下,你回家过节,你的家人决定聚会。而不是让一个人做所有的烹饪,每个人都同意带上他们擅长制作的特色菜。目标是通过组合所有这些菜肴来制作一顿完整的饭菜。你同意做鸡肉炒饭,你哥哥做甜点蛋糕,妹妹做沙拉。每个菜代表一个具有特定功能或用途的微服务。例如,炒饭代表一道丰盛的主菜;沙拉代表新鲜健康的配菜,蛋糕代表甜蜜甜点。在微

热文推荐