当前位置: 首页 > news >正文

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

文章目录

  • 1. 概念
    • 1.1 角色
    • 1.2 类图
  • 2. 代码示例
    • 2.1 需求
    • 2.2 代码
    • 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 代码

  • 代码
package mainimport "fmt"// 定义抽象迭代器
type Iterator interface {HasNext() boolNext() interface{}
}// 定义具体迭代器
type ConcreteIterator struct {//它关联具体聚合aggregate *ConcreteAggregateindex     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() IteratorAddItem(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 Aggregateaggregate = &ConcreteAggregate{}aggregate.AddItem("Item 1")aggregate.AddItem(2)aggregate.AddItem("Item 3")//实例化一个迭代器iterator := aggregate.CreateIterator()//验证结果for iterator.HasNext() {item := iterator.Next()fmt.Println(item)}
}
  • 输出
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)

在这里插入图片描述

相关文章:

  • 常见React Hooks 钩子函数用法
  • 如何解决网站打开慢,用户访问慢的问题
  • 了解.NET Framework中自带的泛型委托Predicate和Comparison
  • 华为云运维小结
  • 网络安全深入学习第八课——反向代理(工具:frp)
  • flutter开发报错The instance member ‘widget‘ can‘t be accessed in an initializer
  • 目标检测中的评价指标
  • 【排序算法】 快速排序(快排)!图解+实现详解!
  • pytorch与cudatoolkit,cudnn对应关系及安装相应的版本
  • Sleep(0)、Sleep(1)、SwitchToThread()
  • Python武器库开发-常用模块之subprocess模块(十九)
  • ES 未分片 导致集群状态飘红
  • python机器学习——决策树
  • Android transform旋转rotate圆角矩形图roundedCorners,Kotlin
  • uniapp中地图定位功能实现的几种方案
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【391天】每日项目总结系列128(2018.03.03)
  • bootstrap创建登录注册页面
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ECMAScript入门(七)--Module语法
  • Facebook AccountKit 接入的坑点
  • Git的一些常用操作
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SpringCloud集成分布式事务LCN (一)
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 欢迎参加第二届中国游戏开发者大会
  • 计算机常识 - 收藏集 - 掘金
  • 面试遇到的一些题
  • 使用权重正则化较少模型过拟合
  • 跳前端坑前,先看看这个!!
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #define用法
  • #include
  • (11)MSP430F5529 定时器B
  • (23)Linux的软硬连接
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (论文阅读30/100)Convolutional Pose Machines
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转载)OpenStack Hacker养成指南
  • ***详解账号泄露:全球约1亿用户已泄露
  • *Django中的Ajax 纯js的书写样式1
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET简谈设计模式之(单件模式)
  • @RequestMapping 的作用是什么?
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [2010-8-30]
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...