美文网首页
设计模式——迭代器模式

设计模式——迭代器模式

作者: DevilRoshan | 来源:发表于2020-10-30 23:57 被阅读0次

    什么是迭代器模式?

    提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

    实现

    // 抽象迭代器
    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
    

    优点

    • 支持以不同的方式遍历一个聚合对象;
    • 迭代器简化了聚合类;
    • 在同一个聚合上可以有多个遍历;
    • 增加新的聚合类和迭代器类都很方便,无需修改原有代码。

    缺点

    • 增加了系统的复杂性。因为迭代器模式将存储数据和遍历数据的职责分离,增加了新的聚合类需要对应增加新的迭代器类,增加了系统的复杂性。

    使用场景

    • 访问一个聚合对象的内容无需暴露它的内部表示时;
    • 需要为聚合对象提供多种便利方式时;
    • 为遍历不同的聚合结构提供一个统一的接口。

    相关文章

      网友评论

          本文标题:设计模式——迭代器模式

          本文链接:https://www.haomeiwen.com/subject/lathvktx.html