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)
    }
}
相关推荐
该用户已不存在3 分钟前
别再用 if err != nil 了,学会这几个技巧,假装自己是Go大神
后端·go
李广坤1 小时前
状态模式(State Pattern)
设计模式
n8n2 小时前
Go语言操作Redis全面指南
go
李广坤2 小时前
观察者模式(Observer Pattern)
设计模式
李广坤3 小时前
中介者模式(Mediator Pattern)
设计模式
李广坤3 小时前
迭代器模式(Iterator Pattern)
设计模式
李广坤4 小时前
解释器模式(Interpreter Pattern)
设计模式
会跑的葫芦怪4 小时前
Go语言操作Redis
开发语言·redis·golang
静谧之心6 小时前
在 K8s 上可靠运行 PD 分离推理:RBG 的设计与实现
云原生·容器·golang·kubernetes·开源·pd分离
阿无,7 小时前
java23种设计模式之前言
设计模式