《golang设计模式》第三部分·行为型模式-04-迭代器模式(Iterator)

文章目录

  • [1. 概念](#1. 概念)
    • [1.1 角色](#1.1 角色)
    • [1.2 类图](#1.2 类图)
  • [2. 代码示例](#2. 代码示例)
    • [2.1 需求](#2.1 需求)
    • [2.2 代码](#2.2 代码)
    • [2.3 类图](#2.3 类图)

1. 概念

迭代器(Iterator)能够在不暴露聚合体内部表示的情况下,向客户端提供遍历聚合元素的方法。

1.1 角色

  • InterfaceAggregate(抽象聚合):定义存储、添加、删除聚合元素以及创建迭代器对象的接口
  • ConcreteAggregate(具体聚合):实现抽象聚合类。它的方法可以返回一个具体迭代器的实例
  • Iterator(抽象迭代器):定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法
  • Concretelterator(具体迭代器):实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。

1.2 类图

Client <<interface>> Iterator +HasNext() : bool +First() +IsDone() +Next() : interface +CurrentItem() <<interface>> Aggregate +CreateIterator() : Iterator ConcreteIterator +HasNext() : bool +First() +IsDone() +Next() : interface +CurrentItem() ConcreteAggregate +CreateIterator() : Iterator

2. 代码示例

2.1 需求

实例化一个具体聚合,创建一个迭代器实例,用迭代器遍历这个聚合。

迭代器通常还会有查看首元素、尾元素、指针位置等方法,有兴趣可以自己试一下,这个简单示例里不写了。

2.2 代码

  • 代码
go 复制代码
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
	AddItem(item interface{})
}

// 定义具体聚合
type ConcreteAggregate struct {
	items []interface{}
}

// 定义方法,创建迭代器
func (a *ConcreteAggregate) CreateIterator() Iterator {
	return &ConcreteIterator{aggregate: a}
}

// 定义方法,添加item(为了测试方便,和迭代器方法无关)
func (a *ConcreteAggregate) AddItem(item interface{}) {
	a.items = append(a.items, item)
}

func main() {
	//实例化一个聚合,加入三个Item,他们的类型可以不同
	var aggregate Aggregate
	aggregate = &ConcreteAggregate{}
	aggregate.AddItem("Item 1")
	aggregate.AddItem(2)
	aggregate.AddItem("Item 3")

	//实例化一个迭代器
	iterator := aggregate.CreateIterator()
	//验证结果
	for iterator.HasNext() {
		item := iterator.Next()
		fmt.Println(item)
	}
}
  • 输出
shell 复制代码
Item 1
2
Item 3

2.3 类图

Client <<interface>> Iterator +HasNext() : bool +Next() : interface <<interface>> Aggregate +CreateIterator() : Iterator +AddItem(item:interface) ConcreteIterator +*ConcreteAggregate aggregate +Int index +HasNext() : bool +Next() : interface ConcreteAggregate +[]interface items +CreateIterator() : Iterator +GetItem(index int) : interface +AddItem(item interface)


相关推荐
每天一个秃顶小技巧12 小时前
02.Golang 切片(slice)源码分析(一、定义与基础操作实现)
开发语言·后端·python·golang
恋喵大鲤鱼12 小时前
Golang 空结构体特性与用法
golang·空结构体
q5673152316 小时前
Go语言多线程爬虫与代理IP反爬
开发语言·爬虫·tcp/ip·golang
Chandler2416 小时前
Go语言即时通讯系统 开发日志day1
开发语言·后端·golang
周努力.17 小时前
设计模式之中介者模式
设计模式·中介者模式
李匠202421 小时前
C++GO语言微服务基础技术②
开发语言·c++·微服务·golang
BUG制造机.21 小时前
Go 语言 slice(切片) 的使用
开发语言·后端·golang
Go Dgg1 天前
Go语言实现豆瓣电影Top250爬虫
开发语言·爬虫·golang
yangyang_z1 天前
【C++设计模式之Template Method Pattern】
设计模式
你怎么知道我是队长1 天前
Go语言标识符
后端·golang