设计模式- 迭代器模式(Iterator Pattern)结构|原理|优缺点|场景|示例

embedded/2024/10/18 16:48:49/

迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种方法来顺序访问聚合对象(容器)中的元素,而又不暴露其实现细节。通过使用迭代器,用户可以从不同类型的聚合对象中以统一的方式遍历元素,而无需了解聚合物的内部结构或其存储方式。

结构:

  • Iterator(迭代器)接口: 定义了访问和遍历元素所需的抽象方法,如 hasNext()(是否有下一个元素)、next()(获取下一个元素)等。
  • ConcreteIterator(具体迭代器): 实现了迭代器接口,跟踪当前的遍历位置,并通过与聚合物的具体实现协作来提供对下一个元素的访问。
  • Aggregate(聚合)接口/抽象类: 定义了创建迭代器对象的接口方法,如 createIterator()
  • ConcreteAggregate(具体聚合): 具体的聚合类,提供了具体的元素存储结构,并实现了创建相应迭代器的方法。

原理:

迭代器模式的工作原理在于,它为聚合对象提供了一种标准的方式来访问内部元素,而无需暴露任何内部的数据结构。通过使用迭代器,用户可以通过简单的接口控制遍历过程,比如逐个获取元素,直到遍历结束。

优缺点:

  • 优点
    • 封装性好,隐藏了集合内部表示,简化了客户端代码。
    • 提供了统一的遍历各种聚合结构的方法,易于扩展和替换不同的数据结构。
    • 支持多种遍历方式,如正向、反向遍历等。
  • 缺点
    • 对于不同的聚合结构,可能需要编写不同的迭代器,增加了类的数量。
    • 迭代器模式只提供了一种线性访问方式,复杂的随机访问可能需要额外的设计。
    • 如果迭代器本身比较复杂,可能会增加系统的理解难度和维护成本。

场景:

  • 当需要遍历集合、数组或其他容器中的元素时。
  • 当希望提供多种遍历方式(顺序、条件等)时。
  • 在不希望暴露集合内部结构或实现细节的情况下,对外提供一致的访问接口。

代码示例(以Java为例)

 

// 聚合接口
public interface Collection {Iterator createIterator();
}// 具体聚合类
public class ConcreteCollection implements Collection {private Object[] items;public Iterator createIterator() {return new ConcreteIterator(this);}// ... 其他实现细节 ...
}// 迭代器接口
public interface Iterator {boolean hasNext();Object next();
}// 具体迭代器类
public class ConcreteIterator implements Iterator {private Collection collection;private int position = 0;public ConcreteIterator(Collection collection) {this.collection = collection;}@Overridepublic boolean hasNext() {return position < collection.size();}@Overridepublic Object next() {if (!hasNext()) {throw new NoSuchElementException();}return collection.getItem(position++);}// ... 其他实现细节 ...
}// 使用示例
public class Client {public static void main(String[] args) {Collection col = new ConcreteCollection();// ... 初始化集合 ...Iterator it = col.createIterator();while (it.hasNext()) {Object item = it.next();System.out.println(item);}}
}

http://www.ppmy.cn/embedded/17520.html

相关文章

vue3+node.js+mysql+ant design实现表格的查询功能

今日主要分享如何运用vue、nodejs、mysql及ant design构建表格数据查询功能&#xff0c;这也是众多项目开发者关注的问题。最关键在于前端与后端的协作&#xff0c;后端数据则通过nodejs编写。尽管涉及多项技术&#xff0c;看似复杂&#xff0c;但实际操作却并非困难。当然&…

Java面试之四种访问权限

在Java中&#xff0c;访问权限控制是通过四种不同的访问修饰符实现的&#xff1a; &#xff08;访问权限就像是门上的锁&#xff0c;不同的修饰符代表着不同的锁类型&#xff09; 1、public&#xff1a; public是最开放的访问级别修饰符。使用public修饰的成员可以被该类所在…

Linux多进程(二)进程通信方式三 共享内存

共享内存提供了一个在多个进程间共享数据的方式&#xff0c;它们可以直接访问同一块内存区域&#xff0c;因此比使用管道或消息队列等通信机制更高效。在多进程程序中&#xff0c;共享内存通常与信号量一起使用&#xff0c;以确保对共享内存的访问是线程安全的。 一、打开/创建…

Docker数据卷的使用

1 数据卷概念 数据卷是一个共给容器使用的特殊文件目录&#xff0c;位于容器中&#xff0c;可以将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改立刻可见&#xff0c;并且更新数据卷不会影响到容器的使用&#xff0c;从而实现数据在主机和容器之间共享。 2 创建数据…

【Vision Pro应用】分享一个收集Apple Vision Pro 应用的网站

您是否也觉得 Vision Pro 应用程序商店经常一遍又一遍地展示相同的几个 VisionOS 应用程序?许多有趣、好玩的应用程序似乎消失得无影无踪,让人很难发现它们。为了帮助大家更轻松地探索和体验最新、最有趣的 Vision Pro 应用程序,这里分享一个网站https://www.findvisionapp.…

1分钟掌握 Python 函数参数

任何编程语言函数都是非常重要的一部分&#xff0c;而在进行函数调用时&#xff0c;了解函数的参数传递方式是非常有必要的。Python中支持哪些传参方式呢&#xff1f; Python中的传参方式是比较灵活的&#xff0c;主要包括以下六种&#xff1a; 按照位置传参按照关键字传参默…

milvus对象存储和消息中间件的工厂设计模式分析

milvus对象存储和消息中间件的工厂设计模式分析 需求 根据参数设置创建mq和storage mq有kafka,pulsar storage有local,minio,remote 配置文件 根据配置文件选择初始化mq和存储: mq:type: pulsarcommon:storageType: minio对于这种类型一个是mq&#xff0c;一个是存储&…

Linux下怎么快速部署MySQL服务,并使用

下载镜像 [zrylocalhost ~]$ docker pull mysql Using default tag: latest latest: Pulling from library/mysql bce031bc522d: Pull complete cf7e9f463619: Pull complete 105f403783c7: Pull complete 878e53a613d8: Pull complete 2a362044e79f: Pull complete 6e4d…