迭代器(Iterator)能够在不暴露聚合体内部表示的情况下,向客户端提供遍历聚合元素的方法。
实例化一个具体聚合,创建一个迭代器实例,用迭代器遍历这个聚合。
迭代器通常还会有查看首元素、尾元素、指针位置等方法,有兴趣可以自己试一下,这个简单示例里不写了。
package main
import "fmt"
// 定义抽象迭代器
type Iterator interface {
HasNext() bool
Next() interface{}
}
// 定义具体迭代器
type ConcreteIterator struct {
//它关联具体聚合
aggregate *ConcreteAggregate
index int
}
// 定义方法,查看迭代是否结束
func (i *ConcreteIterator) HasNext() bool {
return i.index < len(i.aggregate.items)
}
// 定义方法,返回下一个节点
func (i *ConcreteIterator) Next() interface{} {
if i.HasNext() {
item := i.aggregate.items[i.index]
i.index++
return item
}
return nil
}
// 定义抽象聚合
type Aggregate interface {
CreateIterator() Iterator
AddItem(item interface{})
}
// 定义具体聚合
type ConcreteAggregate struct {
items []interface{}
}
// 定义方法,创建迭代器
func (a *ConcreteAggregate) CreateIterator() Iterator {
return &ConcreteIterator{aggregate: a}
}
// 定义方法,添加item(为了测试方便,和迭代器方法无关)
func (a *ConcreteAggregate) AddItem(item interface{}) {
a.items = append(a.items, item)
}
func main() {
//实例化一个聚合,加入三个Item,他们的类型可以不同
var aggregate Aggregate
aggregate = &ConcreteAggregate{}
aggregate.AddItem("Item 1")
aggregate.AddItem(2)
aggregate.AddItem("Item 3")
//实例化一个迭代器
iterator := aggregate.CreateIterator()
//验证结果
for iterator.HasNext() {
item := iterator.Next()
fmt.Println(item)
}
}
Item 1
2
Item 3