迭代器模式

定义

迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。

提供了一种方法顺序的访问一个聚合对象中的各个元素,而不是暴露该对象的内部表示。

这里的聚合对象也叫容器聚合对象,实质上及时包含一组对象的对象,例如数组、链表、树、图、跳表。迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。

一个通俗的总结对于迭代器模式:

流水线上坐一天,每个包裹扫一遍。

优点

迭代器相比于 for 循环的优点

1、迭代器模式封装集合内部的复杂数据结构,开发者不需要了解如何遍历,直接使用容器提供的迭代器即可;

2、迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一;

3、迭代器模式让添加新的遍历算法更加容易,更符合开闭原则。除此之外,因为迭代器都实现自相同的接口,在开发中,基于接口而非实现编程,替换迭代器也变得更加容易。

缺点

由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

适用范围

1、访问一个聚合对象的内容而无须暴露它的内部表示;

2、需要为聚合对象提供多种遍历方式;

3、为遍历不同的聚合结构提供一个统一的接口。

代码实现

使用迭代器输出切片中的名字集合

type Iterator interface {
HasNext() bool
Next() string
} type names []string func (na names) NewIterator() *NameRepository {
return &NameRepository{
index: 0,
names: na,
}
} type NameRepository struct {
index int
names names
} func (nr *NameRepository) HasNext() bool {
if nr.index < len(nr.names) {
return true
}
return false
} func (nr *NameRepository) Next() string {
if nr.HasNext() {
name := nr.names[nr.index]
nr.index++
return name
} return ""
}

测试代码

func TestIterator(t *testing.T) {
names := names{
"小明", "小豆", "小龙",
}
nameRepository := names.NewIterator()
for nameRepository.HasNext() {
t.Log(nameRepository.Next())
}
}

参考

【文中代码】https://github.com/boilingfrog/design-pattern-learning/tree/master/迭代器模式

【大话设计模式】https://book.douban.com/subject/2334288/

【极客时间】https://time.geekbang.org/column/intro/100039001

【迭代器模式】https://boilingfrog.github.io/2021/11/24/使用go实现迭代器模式/

设计模式学习-使用go实现迭代器模式的更多相关文章

  1. C#设计模式学习笔记:(15)迭代器模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7903617.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第三个模式--迭 ...

  2. .NET设计模式(18):迭代器模式(Iterator Pattern)(转)

    概述 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据. ...

  3. 设计模式之第6章-迭代器模式(Java实现)

    设计模式之第6章-迭代器模式(Java实现) “我已经过时了,就不要讲了吧,现在java自带有迭代器,还有什么好讲的呢?”“虽然已经有了,但是具体细节呢?知道实现机理岂不美哉?”“好吧好吧.”(迭代器 ...

  4. 【java设计模式】(6)---迭代器模式(案例解析)

    设计模式之迭代器模式 一.java迭代器介绍 1.迭代器接口 在jdk中,与迭代器相关的接口有两个:Iterator 与 Iterable. Iterator:迭代器,Iterator及其子类通常是迭 ...

  5. 【设计模式】行为型04迭代器模式(Iterator Pattern)

    学习地址:http://www.runoob.com/design-pattern/iterator-pattern.html 迭代器模式,简单来说就是通过迭代的方式对集合进行遍历,在集合的学习中也一 ...

  6. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  7. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  8. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  9. 《JavaScript设计模式与开发实践》-- 迭代器模式

    详情个人博客:https://shengchangwei.github.io/js-shejimoshi-diedaiqi/ 迭代器模式 1.定义 迭代器模式: 是指提供一种方法顺序访问一个聚合对象中 ...

  10. C#设计模式学习笔记:(23)解释器模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8242238.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十一个模式-- ...

随机推荐

  1. Treap(平衡树)

    Treap 前置芝士 二叉搜索树(BST),见 BST. 平衡二叉树(AVL). 先来介绍一下平衡二叉树. 背景 BST 出现以后,人们很快发现一个问题,当其维护一个有序序列时,很可能会退化成链.如图 ...

  2. python WordCloud matplotlib docx 简易生成docx报告

    # encode=utf-8 import numpy as np import matplotlib.pyplot as plt from docx import Document from doc ...

  3. 用ChatGPT 玩转哔哩哔哩

    用ChatGPT 玩转哔哩哔哩 哔哔终结者 BibiGPT 哔哩哔哩 BiliGPT,一款智能AI工具,帮助用户一键总结 哔哩哔哩视频内容,非常省心,软件基于GPT-3.5 AI,如果无法使用,可以使 ...

  4. AliPLC 智能丢包补偿算法,提升弱网环境的通话质量

    在线视频/语音通话逐渐成为人们日常生活的一部分,而复杂多变的网络环境会导致部分音频包无法传送到接收端,造成语音信号的短时中断或者卡顿,这会严重影响通话体验,为解决这类问题,阿里云视频云音频技术团队在综 ...

  5. 传统单节点网站的 Serverless 上云

    什么是函数?刚刚考完数学没多久的我,脑里立马想到的是自变量.因变量.函数值,也就是y=f(x).当然,在计算机里,函数function往往指的是一段被定义好的代码程序,我们可以通过传参调用这个定义好的 ...

  6. ECS模式

    大家好,本文提出了ECS模式.ECS模式是游戏引擎中常用的模式,通常用来组织游戏场景.本文出自我写的开源书<3D编程模式>,该书的更多内容请详见:Github 在线阅读 普通英雄和超级英雄 ...

  7. 机器学习-决策树系列-XGBoost算法-chentianqi大神-集成学习-31

    目录

  8. 使用python的os.walk()对目标路径进行遍历

    需求背景 在使用python处理和扫描系统文件的过程中,经常要使用到目录或者文件遍历的功能,这里通过引入os.walk()的功能直接来实现这个需求. 使用示例 由于功能模块本身比较简单,这里直接提供一 ...

  9. 【Git】常用 Git 命令清单

    [来源]https://blog.csdn.net/hj7jay/article/details/53431717

  10. 【PHP】 延时跳转

    echo "<meta http-equiv=\"refresh\" content=\"5;url="."register.php& ...