迭代器模式(Iterator)/游标(Cursor)
1.意图
提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
2.适用性
迭代器模式可用来:
- 访问一个聚合对象的内容而无需暴露它的内部表示。
- 支持对聚合对象的多种遍历。
- 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。
3.结构
4.代码
package iterator
/*
# 送代器模式
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
送代器模式用于使用相同方式送代不同类型集合或者隐藏集合类型的具体实现。
可以使用送代器模式使遍历同时应用送代策略,如请求新对象、过滤、处理对象等。
*/
import "testing"
// Iterator 迭代器接口
type Iterator interface {
HasNext() bool
Next()
Value() interface{}// 获取当前元素
}
// ArrayInt 数组
type ArrayInt []int
// Iterator 返回迭代器
func (this ArrayInt) Iterator() Iterator {
return &ArrayIntIterator{
arrayInt: this,
index: 0,
}
}
// ArrayIntIterator 数组迭代器
type ArrayIntIterator struct {
arrayInt ArrayInt
index int
}
// HasNext 是否有下一个
func (this *ArrayIntIterator) HasNext() bool {
return this.index < len(this.arrayInt)-1
}
// Next 游标加一
func (this *ArrayIntIterator) Next() {
if this.index < len(this.arrayInt)-1{
this.index++
}
}
// Value 获取当前元素
func (this *ArrayIntIterator) Value() interface{} {
return this.arrayInt[this.index]
}
func TestIterator(t *testing.T) {
data := ArrayInt{1, 3, 5, 7, 9}
iterator := data.Iterator()
for iterator.HasNext() {
t.Log(iterator.Value())
iterator.Next()
}
}