[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] 模式

    2024-01-21 15:28:01       32 阅读
  2. ·模式

    2024-01-21 15:28:01       29 阅读
  3. 模式

    2024-01-21 15:28:01       11 阅读
  4. GO设计模式——18、模式(行为型)

    2024-01-21 15:28:01       45 阅读
  5. 模式(Iterator)

    2024-01-21 15:28:01       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-21 15:28:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-21 15:28:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-21 15:28:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-21 15:28:01       18 阅读

热门阅读

  1. MVC的设计理念

    2024-01-21 15:28:01       35 阅读
  2. 野指针(C语言)

    2024-01-21 15:28:01       30 阅读
  3. rust嵌入式之用类函数宏简写状态机定义

    2024-01-21 15:28:01       31 阅读
  4. 小程序定制开发流程

    2024-01-21 15:28:01       35 阅读
  5. HTTP 第二章 发展历史

    2024-01-21 15:28:01       31 阅读
  6. Could not load library libcudnn_cnn_infer.so.8

    2024-01-21 15:28:01       35 阅读
  7. 银行虚拟户和实体账户之间存在一些区别?

    2024-01-21 15:28:01       127 阅读
  8. 系统架构13 - 软件工程(1)

    2024-01-21 15:28:01       33 阅读
  9. 如何使用Webpack打包vue文件

    2024-01-21 15:28:01       30 阅读
  10. Js中的Array.prototype.sort()

    2024-01-21 15:28:01       31 阅读
  11. unity 利用Graphics.Blit来制作图片效果

    2024-01-21 15:28:01       33 阅读
  12. tsconfig.json配置详解

    2024-01-21 15:28:01       32 阅读