目录
迭代器模式(Iterator Pattern)
迭代器模式的核心角色:
优缺点
使用场景
代码实现
迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern)提供了一种统一的方式来访问一个容器对象中的各个元素,而无需暴露其内部结构。
迭代器模式的核心角色:
- 迭代器(Iterator):定义了访问和遍历元素的接口。
- 具体迭代器(Concrete Iterator):实现了迭代器接口,负责具体的遍历逻辑。
- 容器(Container):定义了获取迭代器的接口。
- 具体容器(Concrete Container):实现了容器接口,负责创建具体迭代器对象。
优缺点
(1)优点:
- 它支持以不同的方式遍历一个聚合对象。
- 迭代器简化了聚合类。
- 在同一个聚合上可以有多个遍历。
- 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
(2)缺点:
- 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景
- 访问一个聚合对象的内容而无须暴露它的内部表示。
- 需要为聚合对象提供多种遍历方式。
- 为遍历不同的聚合结构提供一个统一的接口。
代码实现
package mainimport "fmt"// 音乐播放器,该播放器可以存储和管理多个音乐文件。希望能够遍历播放器中的所有音乐文件,并对其进行操作,例如播放、暂停、下一首等。// 迭代器接口
type Iterator interface {HasNext() boolNext() interface{}
}// 具体迭代器:音乐播放器迭代器
type MusicPlayerIterator struct {musicPlayer *MusicPlayerindex 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)}
}