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

一、简介

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

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

二、优点

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

三、适用场景

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

四、UML类图

五、案例

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

go 复制代码
package main

import "fmt"

type Iterator interface {
	HasNext() bool
	Next() 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     int
	BookShelf *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 += 1
		return 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)
	}
}
相关推荐
兵bing1 小时前
设计模式-访问者模式
设计模式·访问者模式
python零基础入门小白1 小时前
【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通)
java·开发语言·设计模式·语言模型·架构·大模型应用开发·大模型学习
MC丶科2 小时前
Java设计模式漫画英雄宇宙-工厂模式 —Factory博士的“超级英雄制造机”!
java·设计模式·漫画
明洞日记3 小时前
【设计模式手册013】命令模式 - 请求封装的优雅之道
java·设计模式·命令模式
ada0_ada13 小时前
行为型模式:②命令模式(Command Pattern)
设计模式
o0向阳而生0o4 小时前
113、23种设计模式之中介者模式(21/23)
设计模式·中介者模式
心语星光4 小时前
23种经典设计模式
设计模式
ACE19851 天前
AI Agent 设计模式深度解析:提示链(Prompt Chaining)模式
人工智能·设计模式·prompt
明洞日记1 天前
【设计模式手册012】责任链模式 - 请求处理的流水线艺术
java·设计模式·责任链模式
ada0_ada11 天前
行为型模式:①责任链模式(Chain of Responsibility Pattern)
设计模式