GO设计模式——18、迭代器模式(行为型)

目录

[迭代器模式(Iterator Pattern)](#迭代器模式(Iterator Pattern))

迭代器模式的核心角色:

优缺点

使用场景

代码实现


迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)提供了一种统一的方式来访问一个容器对象中的各个元素,而无需暴露其内部结构。

迭代器模式 的核心角色:

  • 迭代器(Iterator):定义了访问和遍历元素的接口。
  • 具体迭代器(Concrete Iterator):实现了迭代器接口,负责具体的遍历逻辑。
  • 容器(Container):定义了获取迭代器的接口。
  • 具体容器(Concrete Container):实现了容器接口,负责创建具体迭代器对象。

优缺点

(1)优点:

  • 它支持以不同的方式遍历一个聚合对象。
  • 迭代器简化了聚合类。
  • 在同一个聚合上可以有多个遍历。
  • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

(2)缺点:

  • 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

使用场景

  • 访问一个聚合对象的内容而无须暴露它的内部表示。
  • 需要为聚合对象提供多种遍历方式。
  • 为遍历不同的聚合结构提供一个统一的接口。

代码实现

Go 复制代码
package main

import "fmt"

// 音乐播放器,该播放器可以存储和管理多个音乐文件。希望能够遍历播放器中的所有音乐文件,并对其进行操作,例如播放、暂停、下一首等。

// 迭代器接口
type Iterator interface {
    HasNext() bool
    Next() interface{}
}

// 具体迭代器:音乐播放器迭代器
type MusicPlayerIterator struct {
    musicPlayer *MusicPlayer
    index       int
}

func NewMusicPlayerIterator(musicPlayer *MusicPlayer) *MusicPlayerIterator {
    return &MusicPlayerIterator{
       musicPlayer: musicPlayer,
       index:       0,
    }
}

func (it *MusicPlayerIterator) HasNext() bool {
    return it.index < len(it.musicPlayer.songs)
}

func (it *MusicPlayerIterator) Next() interface{} {
    if it.HasNext() {
       song := it.musicPlayer.songs[it.index]
       it.index++
       return song
    }
    return nil
}

// 容器:音乐播放器
type MusicPlayer struct {
    songs []string
}

func (mp *MusicPlayer) AddSong(song string) {
    mp.songs = append(mp.songs, song)
}

func (mp *MusicPlayer) GetIterator() Iterator {
    return NewMusicPlayerIterator(mp)
}

// 客户端代码
func main() {
    player := &MusicPlayer{}
    player.AddSong("Song 1")
    player.AddSong("Song 2")
    player.AddSong("Song 3")

    iterator := player.GetIterator()
    for iterator.HasNext() {
       song := iterator.Next().(string)
       fmt.Println("Playing:", song)
    }
}
相关推荐
http阿拉丁神猫1 小时前
Go语言入门笔记:从基础到开发环境搭建(二)
开发语言·笔记·golang
紧跟先前的步伐9 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
高晶10 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
高晶10 小时前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
延晗10 小时前
【从零开始 DeepSeek Harness 插件开发教程】二、一切皆插件:简单理解一下 Cordis 内核与 DSH 心智模型
设计模式·deepseek
高晶11 小时前
Android 通讯录应用开发实战:从零搭建 SQLite 数据持久化完整项目
android·设计模式·前端框架
GlobalTradercrb11 小时前
独立站SEO先写博客还是先优化产品页?看站点阶段
数据库·人工智能·google·pdf·go·seo
紧跟先前的步伐12 小时前
Go AI Agent 实战 02|大语言模型(LLM)到底是怎么工作的
人工智能·语言模型·golang
用户1257585243613 小时前
GoFrame Vue3开源后台管理系统推荐:数据库与Worker要求怎么验
数据库·后端·go
王中阳Go13 小时前
面到 harness 架构就卡住的人,多半是做过但没这么叫过
架构·go·agent