什么是迭代器模式?
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
实现
// 抽象迭代器
type Iterator interface {
Index() int
Value() interface{}
HasNext() bool
Next()
}
// 具体容器
type ArrayIterator struct {
array []interface{}
index *int
}
func NewArrayIterator() *ArrayIterator {
return &ArrayIterator{}
}
func (this *ArrayIterator) Index() *int {
return this.index
}
func (this *ArrayIterator) Value() interface{} {
return this.array[*this.index]
}
func (this *ArrayIterator) HasNext() bool {
return *this.index+1 <= len(this.array)
}
func (this *ArrayIterator) Next() {
if this.HasNext() {
*this.index++
}
}
func TestArrayIterator(t *testing.T) {
array := []interface{}{1, 3, 4, 6, 7, 5, 2}
a := 0
iterator := ArrayIterator{index:&a, array:array}
for iter := iterator; iter.HasNext() ;iter.Next() {
index, value := iter.Index(), iter.Value().(int)
for value != array[*index] {
fmt.Println("error")
}
fmt.Println(*index, value)
}
}
// === RUN TestArrayIterator
// 0 1
// 1 3
// 2 4
// 3 6
// 4 7
// 5 5
// 6 2
// --- PASS: TestArrayIterator (0.00s)
// PASS
优点
- 支持以不同的方式遍历一个聚合对象;
- 迭代器简化了聚合类;
- 在同一个聚合上可以有多个遍历;
- 增加新的聚合类和迭代器类都很方便,无需修改原有代码。
缺点
- 增加了系统的复杂性。因为迭代器模式将存储数据和遍历数据的职责分离,增加了新的聚合类需要对应增加新的迭代器类,增加了系统的复杂性。
使用场景
- 访问一个聚合对象的内容无需暴露它的内部表示时;
- 需要为聚合对象提供多种便利方式时;
- 为遍历不同的聚合结构提供一个统一的接口。
网友评论