迭代器模式
简介
迭代器模式(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)
}
}