专栏名称: silsuer在掘金
后端研发 - go/php
目录
相关文章推荐
今日房产  ·  2比8,老静安涨不过杨浦? ·  23 小时前  
贵州日报  ·  铜仁市人民政府最新人事任免 ·  昨天  
51好读  ›  专栏  ›  silsuer在掘金

golang设计模式之迭代器模式

silsuer在掘金  · 掘金  ·  · 2018-12-07 05:38

正文

请到「今天看啥」查看全文


简单点说,为一个容器设置一个迭代函数,可以使用这个迭代函数来顺序访问其中的每一个元素,而外部无需知道底层实现。

如果再结合 访问者模式 ,向其中传入自定义的访问者,那么就可以让访问者访问容器中的每个元素了。

类图

(图源网络)

角色

  • 抽象聚合类: 定义一个抽象的容器

  • 具体聚合类: 实现上面的抽象类,作为一个容器,用来存放元素,等待迭代

  • 抽象迭代器: 迭代器接口,每个容器下都有一个该迭代器接口的具体实现

  • 具体迭代器: 根据不同的容器,需要定义不同的具体迭代器,定义了游标移动的具体实现

举个栗子

  1. 创建抽象容器结构体
 // 容器接口
 type IAggregate interface {
 	Iterator() IIterator
 }
复制代码
  1. 创建抽象迭代器
 // 迭代器接口
 type IIterator interface {
     HasNext() bool
     Current() int
     Next() bool
 }
复制代码

迭代器的基本需求,需要有判定是否迭代到最后的方法 HasNext() ,需要有获得当前元素的方法 Current() ,需要有将游标移动到下一个元素的方法 Next()

  1. 实现容器
  // 具体容器
  type Aggregate struct {
    container []int // 容器中装载 int 型容器
  }
  // 创建一个迭代器,并让迭代器中的容器指针指向当前对象
  func (a *Aggregate) Iterator() IIterator {
       i := new(Iterator)
       i.aggregate = a
       return i
   }
复制代码

为了简便,这里我们仅仅让容器中存放 int 类型的数据

  1. 实现迭代器
 type Iterator struct {
     cursor    int // 当前游标
     aggregate *Aggregate // 对应的容器指针
 }
 
 // 判断是否迭代到最后,如果没有,则返回true
 func






请到「今天看啥」查看全文