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

【设计模式】第18节:行为型模式之“迭代器模式”

一、简介

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

在通过迭代器来遍历集合元素的同时,增加或者删除集合中的元素,有可能会导致某个元素被重复遍历或遍历不到。有两种比较干脆利索的解决方案,来避免出现这种不可预期的运行结果。一种是遍历的时候不允许增删元素,另一种是增删元素之后让遍历报错。第一种解决方案比较难实现,因为很难确定迭代器使用结束的时间点。第二种解决方案更加合理。

二、优点

  • 抽象性
  • 简化客户端代码
  • 支持多种集合类型
  • 解耦

三、适用场景

  • 遍历不同类型的集合
  • 集合实现可能发生变化
  • 提供一致的遍历接口

四、UML类图

请添加图片描述

五、案例

遍历书架上的书并打印书名。

package mainimport "fmt"type Iterator interface {HasNext() boolNext() interface{}
}type Book struct {Title string
}func NewBook(title string) *Book {return &Book{Title: title}
}type BookShelf struct {BookList []*Book
}func NewBookShelf() *BookShelf {return &BookShelf{BookList: []*Book{}}
}func (bs *BookShelf) AddBook(book *Book) {bs.BookList = append(bs.BookList, book)
}type BookIterator struct {Index     intBookShelf *BookShelf
}func NewBookIterator(bookShelf *BookShelf) *BookIterator {return &BookIterator{Index: 0, BookShelf: bookShelf}
}func (bi *BookIterator) HasNext() bool {return bi.Index < len(bi.BookShelf.BookList)
}func (bi *BookIterator) Next() interface{} {if bi.HasNext() {book := bi.BookShelf.BookList[bi.Index]bi.Index += 1return book}return nil
}func main() {bookShelf := NewBookShelf()bookShelf.AddBook(NewBook("book 1"))bookShelf.AddBook(NewBook("book 2"))bookShelf.AddBook(NewBook("book 3"))bookIterator := NewBookIterator(bookShelf)for bookIterator.HasNext() {bookObj := bookIterator.Next()book := bookObj.(*Book)fmt.Println(book.Title)}
}
http://www.lryc.cn/news/217422.html

相关文章:

  • 【数据结构】单链表OJ题
  • 智能工厂架构
  • 阿里云多款ECS产品全面升级 性能最多提升40%
  • 责任链模式(Chain of Responsibility)
  • 文件管理技巧:根据大小智能分类并移动至目标文件夹
  • 具有自主产权的SaaS门店收银系统全套源码输出
  • 论文阅读:One Embedder, Any Task: Instruction-Finetuned Text Embeddings
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • 软件测试---边界值分析(功能测试)
  • 使用pytorch处理自己的数据集
  • http进一步认识
  • grafana docker安装
  • 【Kubernetes】初识k8s--扫盲阶段
  • “01”滴答“摩尔斯电码”加密解密单个字符
  • P3817 小A的糖果
  • Yolov8目标识别与实例分割——算法原理详细解析
  • HandlerMethodArgumentResolver方法参数解析器支持多用户
  • 【Linux】 man命令使用
  • 同一个数据库服务器进行数据表间的数据迁移-MySQL
  • 适用于 Linux 的 WPF:Avalonia
  • 【教3妹学编程-算法题】数组中两个数的最大异或值
  • STM32-RTC实时时钟
  • 初学Flutter,实现底部导航切换
  • 使用JMeter进行接口压力测试
  • ElasticSearch集群架构实战及其原理剖析
  • 选择适合你的办公桌:提高工作效率的关键
  • 机器学习之多层感知机 MLP简洁实现 《动手深度学习》实例
  • 使用C#在Windows上调用7-zip压缩文件
  • 京东数据平台:2023年Q3季度黄金市场数据分析
  • https原理