《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)


相关推荐
__AtYou__11 小时前
Golang | Leetcode Golang题解之第448题找到所有数组中消失的数字
leetcode·golang·题解
千年死缓12 小时前
go+redis基于tcp实现聊天室
redis·tcp/ip·golang
吃着火锅x唱着歌16 小时前
Redis设计与实现 学习笔记 第五章 跳跃表
golang
技术卷19 小时前
Redis数据库与GO完结篇:redis操作总结与GO使用redis
数据库·redis·golang
white.tie21 小时前
vscode配置golang
ide·vscode·golang
陈序缘21 小时前
Go语言实现长连接并发框架 - 任务管理器
linux·服务器·开发语言·后端·golang
蜡笔小新..1 天前
【设计模式】软件设计原则——开闭原则&里氏替换&单一职责
java·设计模式·开闭原则·单一职责原则
性感博主在线瞎搞1 天前
【面向对象】设计模式概念和分类
设计模式·面向对象·中级软件设计师·设计方法
lucifer3111 天前
JavaScript 中的组合模式(十)
javascript·设计模式
lucifer3111 天前
JavaScript 中的装饰器模式(十一)
javascript·设计模式