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


相关推荐
b***65321 小时前
Go-Gin Web 框架完整教程
前端·golang·gin
皖南大花猪1 小时前
Go 项目中使用 Casbin 实现 RBAC 权限管理完整教程
开发语言·后端·golang·rbac·casbin
源代码•宸1 小时前
GoLang写一个火星漫游行动
开发语言·经验分享·后端·golang
le serein —f2 小时前
用go实现-回文链表
算法·leetcode·golang
谷隐凡二2 小时前
Go语言实现Kubernetes主从架构模拟系统细节说明(姐妹篇)
架构·golang·kubernetes
繁华似锦respect2 小时前
C++ 设计模式之工厂模式详细介绍
java·linux·c++·网络协议·设计模式
想要成为祖国的花朵2 小时前
基于多设计模式的抽奖系统__测试报告
java·selenium·测试工具·jmeter·设计模式·测试用例·安全性测试
Zfox_4 小时前
【Go】 协程和 channel
开发语言·后端·golang
a***81394 小时前
【Go】Go语言基础学习(Go安装配置、基础语法)
服务器·学习·golang
k***92164 小时前
【Golang】——Gin 框架中的表单处理与数据绑定
microsoft·golang·gin