设计模式: 行为型之中迭代器模式(21)

2024-04-13 18:28

本文主要是介绍设计模式: 行为型之中迭代器模式(21),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

迭代器模式概述

  • 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式
  • 它提供了一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示,这种模式属于行为型模式
  • 迭代器模式的核心思想是将集合对象的迭代行为抽象到迭代器中,提供一致的接口
  • 使得不同的容器可以提供一致的遍历行为,而不用关心容器内元素的组成结构
  • 这种设计方式解耦了迭代与集合,使得集合对象本身无需关心遍历的逻辑,而迭代器对象则专注于遍历的实现
  • 迭代器模式可以通过实现 Iterator 接口和 Iterable 接口来实现
  • Iterator 接口要求实现一个 next() 方法,该方法返回一个对象,该对象有两个属性:value 和 done
  • value 表示当前的元素值,done 是一个布尔值,表示是否还有更多的元素可以迭代
  • Iterable 接口则要求对象必须有一个 Symbol.iterator 方法,该方法返回一个迭代器对象

迭代器模式应用

// 1. 定义迭代器接口
interface Iterator<T> {next(): { value: T | undefined, done: boolean };reset?(): void; // 可选方法,用于重置迭代器到起始位置
}// 2. 定义聚合对象接口,要求能提供创建迭代器的方法
interface Aggregate<T> {createIterator(): Iterator<T>;
}// 3. 创建具体聚合对象类
class ConcreteAggregate<T> implements Aggregate<T> {private items: T[];constructor(...items: T[]) {this.items = items;}createIterator(): Iterator<T> {return new ConcreteIterator(this.items);}
}// 4. 创建具体迭代器类
class ConcreteIterator<T> implements Iterator<T> {private items: T[];private currentIndex = 0;constructor(items: T[]) {this.items = items;}next(): { value: T | undefined, done: boolean } {if (this.currentIndex < this.items.length) {const value = this.items[this.currentIndex];this.currentIndex++;return { value, done: false };} else {return { value: undefined, done: true };}}// 如果需要,还可以实现重置方法reset(): void {this.currentIndex = 0;}
}// 使用示例
function main() {const aggregate = new ConcreteAggregate<number>(1, 2, 3, 4, 5);const iterator = aggregate.createIterator();while (true) {const { value, done } = iterator.next();if (done) break;console.log(value); // 输出:1, 2, 3, 4, 5}
}main();
  • 在这个示例中, 定义了 Iterator 接口,其中包含 next 方法,用于返回当前元素和一个布尔值指示是否遍历结束
  • 定义了 Aggregate 接口,要求聚合对象能提供一个创建迭代器的方法
  • ConcreteAggregate 类实现了 Aggregate 接口,并在其构造函数中存储了一系列元素, 它提供了创建 ConcreteIterator 的方法
  • ConcreteIterator 类实现了 Iterator 接口,其中包含了遍历聚合对象元素的逻辑,通过索引跟踪当前位置,并在 next 方法中返回当前元素和遍历状态
  • main 函数中,我们创建了 ConcreteAggregate 对象并获取其迭代器,然后通过迭代器遍历并输出聚合对象的所有元素

迭代器模式的应用场景

  • 迭代器模式的应用场景非常广泛,它特别适用于需要遍历聚合对象且希望提供多种遍历方式的场景

  • 遍历复杂数据结构

    • 当需要遍历如树形结构、图或其他非线性数据结构等复杂的数据结构时,迭代器模式非常有用
    • 通过使用迭代器,我们可以方便地访问这些数据结构中的各个元素,而无需了解它们的底层表示方式
    • 统一遍历接口
      • 当需要为不同的聚合对象提供一个统一的遍历接口时,迭代器模式可以派上用场
      • 例如,当同时处理数组、列表、树等多种数据结构时,通过迭代器模式,我们可以将遍历操作的职责分离出来,由迭代器类统一管理
      • 这样,客户端代码可以通过迭代器来访问不同的聚合对象,而无需关心它们的具体实现细节
    • 提供多种遍历方式
      • 迭代器模式还可以用于提供多种遍历方式
      • 通过实现不同的迭代器类,我们可以以不同的方式遍历同一个聚合对象
      • 这样,客户端代码可以根据需要选择合适的迭代器,从而实现更加灵活的遍历操作
      • 例如,对于同一个树形结构,我们可以实现前序遍历迭代器、后序遍历迭代器等多种迭代器,以满足不同的遍历需求
  • 内容保密与统一接口

    • 在访问集合对象的内容时,迭代器模式允许我们无需暴露其内部表示
    • 这对于那些需要保护数据隐私或隐藏实现细节的场景非常有用
    • 同时,通过为不同的容器类型提供统一的遍历方式,迭代器模式降低了客户端代码与聚合对象之间的耦合度,使得代码更加灵活和可维护
  • 综上所述

    • 迭代器模式在数据处理、数据结构遍历以及接口统一等方面具有广泛的应用价值
    • 通过使用该模式,我们可以简化代码、降低耦合度,并提供更加灵活和可扩展的遍历方式

迭代器模式优缺点


1 ) 优点

  • 封装遍历逻辑

    • 迭代器模式将遍历集合元素的逻辑封装在迭代器对象中,使得客户端代码无需关心集合的内部结构和数据存储方式
    • 只需通过迭代器提供的统一接口进行访问
  • 支持多种遍历方式

    • 针对同一种数据结构,可以通过创建不同的迭代器实现不同的遍历顺序(如正序、逆序、深度优先、广度优先等)
    • 使客户端可以选择合适的遍历方式
  • 简化聚合类

    • 聚合类(如列表、树、图等)无需暴露内部结构(如索引、指针等)来支持遍历,只需提供创建迭代器的方法
    • 这使得聚合类的接口更简洁,同时隐藏了内部实现细节,增强了封装性
  • 符合单一职责原则

    • 将数据存储和数据遍历的职责分离,使得每个类专注于各自的职责
    • 提高了代码的可读性和可维护性
  • 易于扩展

    • 添加新的聚合类或新的遍历方式时,只需增加新的迭代器类
    • 而无需修改现有的客户端代码,符合开闭原则

2 )缺点

  • 增加类的数目
    • 每种数据结构和遍历方式都需要一个对应的迭代器类
    • 可能导致类的数量增多,特别是在需要支持多种遍历方式时
  • 额外的复杂性
    • 对于简单数据结构和简单遍历需求,使用迭代器模式可能会引入不必要的复杂性
    • 在这种情况下,直接使用循环或其他简单的遍历方式可能更为简洁
  • 对集合的修改限制
    • 在迭代过程中,如果同时修改集合(如添加、删除元素)
    • 可能会导致迭代器行为异常或抛出错误,需要特别注意并发修改的问题
    • 某些语言或库提供了安全的迭代器来应对这种情况
  • 无法直接访问特定索引
    • 迭代器通常按顺序访问元素,如果需要直接访问特定索引的元素
    • 可能不如直接使用索引来得直接和高效
  • 综上所述
    • 迭代器模式适用于需要对不同数据结构进行统一遍历操作
    • 且可能需要支持多种遍历方式的场景。对于简单数据结构和简单遍历需求
    • 直接使用基础的循环或索引访问可能更为合适
    • 在使用迭代器模式时,需要权衡其带来的优点(如封装性、扩展性)与可能引入的额外复杂性

这篇关于设计模式: 行为型之中迭代器模式(21)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/900879

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易