经典设计模式(Golang)

迭代器模式

Posted by Dingding on August 1, 2019

概述

  • 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
  • 主要解决:不同的方式来遍历整个整合对象。
  • 何时使用:遍历一个聚合对象。
  • 如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。

  • 注意:由于golang没有内部类的概念,经典的迭代器模式用golang实现代码稍显丑陋,这里展示的是利用闭包的实现。

实现

package main

import (
	"fmt"
)

type Info struct {
	data string
}

type Set []Info

func (s Set) Iterator() func() (Info, bool) {
	i := 0

	return func() (info Info, ok bool) {
		if i >= len(s) {
			return info, false
		}
		info = s[i]
		i++
		return info, true
	}
}

func main() {
	s := Set{
		Info{data: "a"},
		Info{data: "b"},
	}

	it := s.Iterator() //获取迭代器
	for {
		info, ok := it()
		if !ok {
			break
		}
		fmt.Println(info)
	}
}