DAY 29:Iterator Pattern,迭代各种不同的物件

什麽是 Iterator Pattern?

将不同资料物件透过一致的方式取得其中的元素

问题情境

string[]string是两种不同的资料型态,我们需要迭代里头全部的元素。

解决方式

设计一个Iteratorinterface 介面,里头.HasNext()用来确认是否还拥有下一个元素,.Next()用来取得元素与把元素 index 往後移。

string[]stringIterableString{}IterableSliceString{}实作Iteratorinterface,PrintAllItems()依赖此 interface 将元素印出。

相关的 code 在Github - go-design-patterns

code 如下:

package main

import "fmt"

type Iterator interface {
	HasNext() bool
	Next() interface{}
}

type IterableSliceString []string

func (i IterableSliceString) Iterator() Iterator {
	return &SliceStringIterator{
		original: i,
		index:    0,
	}
}

type SliceStringIterator struct {
	original IterableSliceString
	index    int
}

func (s *SliceStringIterator) HasNext() bool {
	return s.index < len(s.original)
}

func (s *SliceStringIterator) Next() interface{} {
	item := s.original[s.index]
	s.index++
	return item
}

type IterableString string

func (i IterableString) Iterator() Iterator {
	return &StringIterator{
		original: i,
		index:    0,
	}
}

type StringIterator struct {
	original IterableString
	index    int
}

func (s *StringIterator) HasNext() bool {
	return s.index < len(s.original)
}

func (s *StringIterator) Next() interface{} {
	item := string(s.original[s.index])
	s.index++
	return item
}

func PrintAllItems(iterator Iterator) {
	for iterator.HasNext() {
		fmt.Println(iterator.Next())
	}
}

func main() {
	PrintAllItems(IterableSliceString{"a", "b", "c"}.Iterator())
	PrintAllItems(IterableString("abcd").Iterator())
}

需注意的是,golang 已经有range关键字可以迭代stringmapslice等型态,但 Iterator Pattern 不限定这些型态,而是任意型态只要满足Iteratorinterface 的实作即可,例如 golang database/sql.Next()就是以 Iterator Pattern 对 rows 一个一个迭代。


<<:  3.1 Design System - 管理平台

>>:  DAY 27 - 野猪枪手 (3) 完

Day06 - 随意玩之 OrderQuery/OrderPayQuery

昨天介绍了 OrderCreate,今天会把另外两个都介绍完! OrderQuery 主要功能:查询...

JavaScript Day11 - 回圈

for、while 可参考:Day13 - 回圈(01) 还蛮常搭配阵列使用的 for (初始值 ;...

阴影(上)

大家好,我是西瓜,你现在看到的是 2021 iThome 铁人赛『如何在网页中绘制 3D 场景?从 ...

Day 5 - TiDB架构

TiDB里头的TiDB,听起来有点饶舌,为了避免混淆,後面会加个server来做区别。TiDB se...

[进阶指南] 严格模式( Day29 )

我们可以在开发环境中使用 <React.StrictMode>进入严格模式 严格模式帮...