[go] 迭代器模式

简介: [go] 迭代器模式

迭代器模式


提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露其内部的表示。


模型说明



  • Iterator: 接口声明了遍历集合所需的操作: 获取下一个元素、 获取当前位置和重新开始迭代等。
  • IterableCollection: 接口声明一个或多个方法来获取与集合兼容的迭代器。 请注意, 返回方法的类型必须被声明为迭代器接口, 因此具体集合可以返回各种不同种类的迭代器。
  • ConcreteIterator: 实现遍历集合的一种特定算法。 迭代器对象必须跟踪自身遍历的进度。 这使得多个迭代器可以相互独立地遍历同一集合。
  • ConcreteCollection: 会在客户端请求迭代器时返回一个特定的具体迭代器类实体。 你可能会琢磨, 剩下的集合代码在什么地方呢? 不用担心, 它也会在同一个类中。 只是这些细节对于实际模式来说并不重要, 所以我们将其省略了而已。
  • Client: 通过集合和迭代器的接口与两者进行交互。 这样一来客户端无需与具体类进行耦合, 允许同一客户端代码使用各种不同的集合和迭代器。
  • 客户端通常不会自行创建迭代器, 而是会从集合中获取。 但在特定情况下, 客户端可以直接创建一个迭代器 (例如当客户端需要自定义特殊迭代器时)。


优缺点


1.优点


  • *单一职责原则:*通过将体积庞大的遍历算法代码抽取为独立的类, 你可对客户端代码和集合进行整理。
  • *开闭原则:*你可实现新型的集合和迭代器并将其传递给现有代码, 无需修改现有代码。
  • 你可以并行遍历同一集合, 因为每个迭代器对象都包含其自身的遍历状态。
  • 相似的, 你可以暂停遍历并在需要时继续。


2.缺点


  • 如果你的程序只与简单的集合进行交互, 应用该模式可能会矫枉过正。
  • 对于某些特殊集合, 使用迭代器可能比直接遍历的效率低。


使用场景


  • 当集合背后为复杂的数据结构, 且你希望对客户端隐藏其复杂性时 (出于使用便利性或安全性的考虑),可以使用迭代器模式。
  • 使用该模式可以减少程序中重复的遍历代码。
  • 如果你希望代码能够遍历不同的甚至是无法预知的数据结构,可以使用迭代器模式。


参考代码


// iterator.go 迭代器接口
type Iterator interface {
 hasNext() bool
 getNext() *User
}
// userIterator.go 具体迭代器
type UserIterator struct {
 index int
 users []*User
}
func (u *UserIterator) hasNext() bool {
 if u.index < len(u.users) {
  return true
 }
 return false
}
func (u *UserIterator) getNext() *User {
 if u.hasNext() {
  user := u.users[u.index]
  u.index++
  return user
 }
 return nil
}
// collection.go 集合接口
type Collection interface {
 createIterator() Iterator
}
// userCollection.go 具体集合
type User struct {
 name string
 age  int
}
type UserCollection struct {
 users []*User
}
func (u *UserCollection) createIterator() Iterator {
 return &UserIterator{
  users: u.users,
 }
}
// main.go 客户端
func main() {
 user1 := &User{
  name: "a",
  age:  30,
 }
 user2 := &User{
  name: "b",
  age:  20,
 }
 userCollection := &UserCollection{
  users: []*User{user1, user2},
 }
 iterator := userCollection.createIterator()
 for iterator.hasNext() {
  user := iterator.getNext()
  fmt.Printf("User is %+v\n", user)
 }
}


output:


User is &{name:a age:30}
User is &{name:b age:20}
相关文章
|
1月前
|
Go
go语言迭代器模式
go语言迭代器模式
34 5
|
8月前
|
设计模式 Go
[设计模式 Go实现] 行为型~迭代器模式
[设计模式 Go实现] 行为型~迭代器模式
|
设计模式 存储 Go
Go语言实现设计模式之迭代器模式
迭代器模式是一种常用的设计模式,它提供了一种统一的方式来访问一个容器对象中的各个元素,而无需暴露其内部结构。本文将详细介绍迭代器模式的概念和原理,并使用Go语言实现一个示例,以帮助读者更好地理解该设计模式的应用。
177 0
|
设计模式 存储 算法
Go设计模式(23)-迭代器模式
迭代器模式从来没有写过,第一次接触迭代器,还是好多年前学C++的STL的时候。当时觉得用迭代器太麻烦了,后来用习惯了觉得真香。
|
26天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
73 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
1月前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
45 7
|
1月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
1月前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
112 71
|
1月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
115 67
|
7天前
|
算法 安全 Go
Go语言中的加密和解密是如何实现的?
Go语言通过标准库中的`crypto`包提供丰富的加密和解密功能,包括对称加密(如AES)、非对称加密(如RSA、ECDSA)及散列函数(如SHA256)。`encoding/base64`包则用于Base64编码与解码。开发者可根据需求选择合适的算法和密钥,使用这些包进行加密操作。示例代码展示了如何使用`crypto/aes`包实现对称加密。加密和解密操作涉及敏感数据处理,需格外注意安全性。
30 14