行为型设计模式—迭代器模式

迭代器模式:也叫作游标模式,能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素。在迭代器的帮助下, 客户端可以用一个迭代器接口以相似的方式遍历不同集合中的元素。

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

在这里插入图片描述

  • Iterator 接口: 这个接口会定义一些基础的操作函数,如hasNext()getNext()等。通过名称就可以看出,这些方法可以帮助我们执行遍历集合、重启迭代等操作。
  • Collection 接口: 这个接口代表了要被遍历的集合。在这个接口里定义了一个createIterator方法,该方法会返回一个Iterator的实例。
  • Concrete Iterator: Iterator接口的具体实现类。
  • Concrete Collection: Collection接口的具体实现类。
  • 客户端 Client:通过集合和迭代器的接口与两者进行交互。 这样一来客户端无需与具体类进行耦合, 允许同一客户端代码使用各种不同的集合和迭代器。

迭代器接口

type Iterator interface {
   
    hasNext() bool
    getNext() *User
}

集合接口

type Collection interface {
   
    createIterator() Iterator
}

用户类

type User struct {
   
    name string
    age  int
}

用户集合数据结构

type UserCollection struct {
   
    users []*User
}

// 实现集合接口
func (u *UserCollection) createIterator() Iterator {
   
    return &UserIterator{
   
        users: u.users,
    }
}

实现迭代器接口

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
}

main函数

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

结果

User is &{name:a age:30}
User is &{name:b age:20}

迭代器模式在平时编程的时候使用的并不多,像Java、C#编程时都自带了迭代器模式的实现,也支持实现语言内置的Iterator接口来给自定义集合创建迭代器。

相关推荐

  1. 设计模式行为设计模式——模式

    2024-01-31 06:56:06       44 阅读
  2. GO设计模式——18、模式行为

    2024-01-31 06:56:06       65 阅读
  3. 设计模式(014)行为模式

    2024-01-31 06:56:06       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-31 06:56:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-31 06:56:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-31 06:56:06       82 阅读
  4. Python语言-面向对象

    2024-01-31 06:56:06       91 阅读

热门阅读

  1. 大数据之水平切分用途原理

    2024-01-31 06:56:06       55 阅读
  2. 消息

    2024-01-31 06:56:06       53 阅读
  3. Kafka常见参数

    2024-01-31 06:56:06       53 阅读
  4. 【技术预研】StarRocks官方文档浅析(3)

    2024-01-31 06:56:06       82 阅读
  5. 【Spark系列6】如何做SQL查询优化和执行计划分析

    2024-01-31 06:56:06       46 阅读
  6. flink分别使用FilterMap和ProcessFunction实现去重逻辑

    2024-01-31 06:56:06       55 阅读
  7. 双非本科准备秋招(11.2)—— 力扣字符串

    2024-01-31 06:56:06       61 阅读
  8. 设计模式七(策略模式)

    2024-01-31 06:56:06       62 阅读