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

news/2024/11/29 22:48:13/

文章目录

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

在这里插入图片描述


http://www.ppmy.cn/news/1200308.html

相关文章

Java——》如何保证线程的安全性

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

SRC | CORS跨资源共享漏洞

CORS跨资源共享 跨源资源共享 (CORS) 是一种浏览器机制&#xff0c;允许网页使用来自其他页面或域的资产和数据。 大多数站点需要使用资源和图像来运行它们的脚本。这些嵌入式资产存在安全风险&#xff0c;因为这些资产可能包含病毒或允许服务器访问黑客。 CORS响应头 CORS通…

不用流氓软件,如何在户外使用手机听下载到家中电脑里的音乐文件呢?

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app3 内网穿透&#xff0c;映射至公网 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手…

国际物流社交销售玩法拆解(一):物流通知这么发,节省80%成本!

在物流运输和信息互联网完美结合的今天&#xff0c;我们享受着物流体系带来的极大便利&#xff1a; 线上购物发货后&#xff0c;收到发货通知&#xff0c;了解商品运输进度&#xff1b; 最后一公里派送时&#xff0c;收到派送推送&#xff0c;确定大概何时能收到商品&#xff…

【Unity细节】为什么UI移动了锚点,中心点和位置,运行的时候还是不在设置的位置当中

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

Java_类和对象详解

文章目录 前言简单认识类类定义和使用类的实例化引用的一些注意事项 类和对象的说明及关系this引用为什么要有this引用this应用this特性 构造方法构造特性及应用用this简化用idea编译器快捷创建构造 封装封装的概念访问限定符 封装的扩展-包包的概念导入包中的类自定义包常见的…

Qt 继承QAbstractListModel实现自定义ListModel

1.简介 QAbstractListModel类提供了一个抽象模型&#xff0c;可以将其子类化以创建一维列表模型。 QAbstractListModel为将其数据表示为简单的非层次项目序列的模型提供了一个标准接口。它不直接使用&#xff0c;但必须进行子类化。 由于该模型提供了比QAbstractItemModel更…

香港条形码如何申请 香港条码注册条件 香港条码申请流程

在进行商 品销 售的过程中&#xff0c;香港条形码是一个必不可少的工具。它是一种唯 一的商品识别码&#xff0c;用于标识和追踪产品。下面&#xff0c;我们将从注册条件和申请流程两个方面&#xff0c;为您详细介绍香港条形码的申请过程。 一、香港条码注册条件 在申请香港条…