跳到主要内容

迭代器模式

简介

迭代器模式(Iterator Pattern)是一种行为型设计模式,它允许顺序访问集合中的元素,而无需暴露集合的内部实现细节。其核心思想是将集合的遍历逻辑集合本身 解耦,使得同一集合可以支持多种遍历方式。

常见使用场景

  • 遍历自定义数据结构

优点

  • 解耦遍历与存储:集合结构变化不影响遍历逻辑
  • 多态遍历:支持不同遍历方式(正序、逆序)
  • 延迟加载:按需获取元素(如大数据集的分页)

缺点

  • 代码复杂度:需定义额外接口和结构体
  • 性能开销:相比直接遍历略有损耗(适用于大多数场景)
  • 过度设计:简单集合(如切片)直接 range 更高效

示例代码

Go

package iterator

// 迭代器接口
type Iterator interface {
HasNext() bool
Next() *Book
}

// 集合接口
type BookCollection interface {
CreateIterator() Iterator
}

// 具体元素
type Book struct {
Title string
}

// 具体集合
type Library struct {
Books []*Book
}

func (l *Library) CreateIterator() Iterator {
return &LibraryIterator{
library: l,
index: 0,
}
}

// 具体迭代器
type LibraryIterator struct {
library *Library
index int
}

func (i *LibraryIterator) HasNext() bool {
return i.index < len(i.library.Books)
}

func (i *LibraryIterator) Next() *Book {
if i.HasNext() {
book := i.library.Books[i.index]
i.index++
return book
}
return nil
}

client

`

package iterator

import (
"testing"
)

func TestIterator(t *testing.T) {
library := &Library{
Books: []*Book{
{"Design Patterns"},
{"The Go Programming Language"},
{"Clean Code"},
},
}

iterator := library.CreateIterator()
for iterator.HasNext() {
book := iterator.Next()
t.Logf("Book: %s\n", book.Title)
}
}