迭代器模式
GitHub代码链接
迭代器模式(Iterator Pattern)是JAVA和.NET中常用的模式,这种模式用于顺序访问集合中的元素。
什么是迭代器模式
迭代器提供一种方法顺序访问一个对象各个元素,而无需暴露对象的内部表示。
迭代器模式解决了什么问题
不同的方式遍历整个集合,把在元素之间游走的责任交给迭代器,而不是集合对象。
优点
- 它支持不同的方式遍历集合对象
- 迭代器简化了聚合类
- 在同一个聚合上面可以有多个遍历
- 迭代器模式中,新增聚合类和迭代器都很方便,无需新增代码
缺点
- 迭代器模式将存储数据和遍历数据职责分离,增加新的聚合类,对应要增加新的迭代器,类的个数成对增加,在一定程度上增加了系统的复杂性。
代码实现
我们使用Go语言匿名函数的功能。来返回一个迭代器。
1.带迭代器的类
//NameRepository 姓名仓库
type NameRepository struct {
Names []string
}
//NewNameRepository 实例化姓名仓库
func NewNameRepository() *NameRepository {
return &NameRepository{
Names: make([]string, 0),
}
}
//GetIterator 获取姓名仓库的迭代器
func (nr *NameRepository) GetIterator() func() (string, bool) {
index := 0
return func() (name string, ok bool) {
if index >= len(nr.Names) {
return
}
name, ok = nr.Names[index], true
index++
return
}
}
//SetName 向姓名仓库添加名字
func (nr *NameRepository) SetName(name string) {
nr.Names = append(nr.Names, name)
}
2.测试
func GetIteratorTest(t *testing.T) {
nameRepository := NewNameRepository()
nameRepository.SetName("Jay")
nameRepository.SetName("JJ")
nameRepository.SetName("Bob")
nameRepository.SetName("Mary")
it := nameRepository.GetIterator()
for {
name, ok := it()
if !ok {
break
}
fmt.Println("Get name: ", name)
}
}