迭代器模式是一种行为型设计模式,它允许我们在不暴露聚合对象内部结构的情况下,遍历其中的元素。在这种模式下,我们使用迭代器对象来遍历聚合对象中的元素。
迭代器模式的实现代码
package main
import (
"fmt"
)
// 定义一个迭代器接口
type Iterator interface {
HasNext() bool
Next() interface{}
}
// 定义一个具体的迭代器结构体
type ConcreteIterator struct {
aggregate *ConcreteAggregate
index int
}
func (i *ConcreteIterator) HasNext() bool {
return i.index < len(i.aggregate.items)
}
func (i *ConcreteIterator) Next() interface{} {
if i.HasNext() {
item := i.aggregate.items[i.index]
i.index++
return item
}
return nil
}
// 定义一个聚合对象接口
type Aggregate interface {
CreateIterator() Iterator
GetItem(index int) interface{}
}
// 定义一个具体的聚合对象结构体
type ConcreteAggregate struct {
items []interface{}
}
func (a *ConcreteAggregate) CreateIterator() Iterator {
return &ConcreteIterator{aggregate: a}
}
func (a *ConcreteAggregate) GetItem(index int) interface{} {
return a.items[index]
}
func (a *ConcreteAggregate) AddItem(item interface{}) {
a.items = append(a.items, item)
}
// 客户端
func main() {
aggregate := &ConcreteAggregate{}
aggregate.AddItem("Item 1")
aggregate.AddItem("Item 2")
aggregate.AddItem("Item 3")
iterator := aggregate.CreateIterator()
for iterator.HasNext() {
item := iterator.Next()
fmt.Println(item)
}
}
终端输出
迭代器模式的代码拆分
1.项目的准备工作
找到 go 的 GOPATH
$ go env //可以查看 GOPATH
在 GOPATH 目录下创建3个文件夹
1.bin文件夹 -- 存放编译后的二进制文件
2.pkg文件夹 -- 存放编译后的库文件
3.src文件夹 -- 存放源码文件
2.创建文件夹
// -- 在项目文件夹 iterator_case 里创建新文件夹
// iterator -- 存放装饰者的全部文件
3.接口文件 -- iterator文件夹
文件1 -- iterator.go
package iterator
// 定义一个迭代器接口
type Iterator interface {
HasNext() bool
Next() interface{}
}
文件2 -- aggregate.go
package iterator
// 定义一个聚合对象接口
type Aggregate interface {
CreateIterator() Iterator
GetItem(index int) interface{}
}
4.结构体文件 -- iterator文件夹
文件1 -- concreteiterator.go
package iterator
// 定义一个具体的迭代器结构体
type ConcreteIterator struct {
aggregate *ConcreteAggregate
index int
}
func (i *ConcreteIterator) HasNext() bool {
return i.index < len(i.aggregate.items)
}
func (i *ConcreteIterator) Next() interface{} {
if i.HasNext() {
item := i.aggregate.items[i.index]
i.index++
return item
}
return nil
}
文件2 -- concreteaggregate.go
package iterator
// 定义一个具体的聚合对象结构体
type ConcreteAggregate struct {
items []interface{}
}
func (a *ConcreteAggregate) CreateIterator() Iterator {
return &ConcreteIterator{aggregate: a}
}
func (a *ConcreteAggregate) GetItem(index int) interface{} {
return a.items[index]
}
func (a *ConcreteAggregate) AddItem(item interface{}) {
a.items = append(a.items, item)
}
5.主文件 -- main.go 在项目文件夹
package main
import (
"design/iterator_case/iterator"
"fmt"
)
// 客户端
func main() {
aggregate := &iterator.ConcreteAggregate{}
aggregate.AddItem("Item 1")
aggregate.AddItem("Item 2")
aggregate.AddItem("Item 3")
iterator := aggregate.CreateIterator()
for iterator.HasNext() {
item := iterator.Next()
fmt.Println(item)
}
}