後端開發 設計模式 · 第 17 / 24 篇

迭代器模式:輕鬆遍歷集合元素

迭代器模式 (Iterator Pattern) 提供統一的方式遍歷集合元素,而不暴露內部結構。本文以 C# 音樂播放清單為例,示範如何輕鬆管理集合。

哈囉朋友們~今天來聊聊迭代器模式(Iterator),這個設計模式能幫你輕鬆管理和操作集合中的元素。

🌟 什麼是迭代器模式?

迭代器模式讓你可以逐一瀏覽集合中的每個元素,而不需知道集合的內部結構。 就像你用音樂 App 播放音樂時,播放清單會自動幫你一首一首播放下一首歌曲,你不需要知道歌曲是怎麼儲存的。這就是迭代器模式的精髓啦!


🤔 什麼情況適合使用迭代器模式?

以下情況很適合使用迭代器模式:

  • 當你需要循序瀏覽集合中的元素,但不想暴露集合的內部結構。
  • 你希望使用相同的方式來遍歷不同類型的集合。
  • 想要讓集合的操作更加直觀與易用。

🎧 C# 迭代器模式範例:音樂播放清單

我們以「音樂播放清單」為範例,讓你輕鬆理解迭代器模式的應用。

🎵 定義抽象迭代器介面

/// <summary>
/// 迭代器介面
/// </summary>
public interface IIterator
{
    /// <summary>
    /// 是否還有下一首
    /// </summary>
    bool HasNext();

    /// <summary>
    /// 取得下一首歌曲
    /// </summary>
    string Next();
}

🎶 建立集合類別(播放清單)

using System.Collections.Generic;

/// <summary>
/// 音樂播放清單
/// </summary>
public class Playlist
{
    private readonly List<string> _songs = new();  // 儲存歌曲
    /// <summary>
    /// 歌曲清單(唯讀)
    /// </summary>
    public IReadOnlyList<string> Songs => _songs;
    /// <summary>
    /// 新增歌曲
    /// </summary>
    public void AddSong(string song)
    {
        _songs.Add(song);
    }

    /// <summary>
    /// 取得播放清單的迭代器
    /// </summary>
    public IIterator GetIterator()
    {
        return new PlaylistIterator(_songs);
    }
}

🎵 建立具體迭代器

using System.Collections.Generic;

/// <summary>
/// 播放清單迭代器
/// </summary>
public class PlaylistIterator : IIterator
{
    private readonly List<string> _songs;         // 播放清單
    private int _currentIndex = 0;                // 目前索引

    public PlaylistIterator(List<string> songs)
    {
        _songs = songs;
    }

    /// <summary>
    /// 是否還有下一首
    /// </summary>
    public bool HasNext()
    {
        return _currentIndex < _songs.Count;
    }

    /// <summary>
    /// 取得下一首歌曲並移動索引
    /// </summary>
    public string Next()
    {
        return HasNext() ? _songs[_currentIndex++] : null;
    }
}

🚀 實際使用範例

using System;

class Program
{
    static void Main(string[] args)
    {
        var playlist = new Playlist();
        playlist.AddSong("Song A");
        playlist.AddSong("Song B");
        playlist.AddSong("Song C");

        IIterator iterator = playlist.GetIterator();

        while (iterator.HasNext())
        {
            Console.WriteLine($"正在播放:{iterator.Next()}");
        }
    }
}

🎯 執行結果

正在播放:Song A
正在播放:Song B
正在播放:Song C

⚠️ 迭代器模式使用注意事項

  • 優點:讓集合的遍歷操作更簡單易用,並與內部實現解耦。
  • 缺點:可能會新增額外的迭代器類別,增加系統複雜度。

🎉 結語

恭喜你輕鬆學會了迭代器模式(Iterator)!有了這個模式,就能更優雅地操作各種集合,提升程式的彈性與可維護性。

繼續追蹤我們的設計模式系列吧,下篇再見啦~

系列:

讀完了!你覺得這篇如何?

你的回饋會決定下一篇要寫什麼。

還有疑問

Learning path

設計模式

這篇是系列中的第 17 / 24 篇。可以順著列表補完整脈絡,也可以直接跳到需要的段落。

  1. 01 搞懂設計模式到底是什麼?
  2. 02 單例模式:只要一個就夠!
  3. 03 工廠方法模式:點披薩不用親自下廚
  4. 04 抽象工廠模式:系列產品輕鬆生產
  5. 05 原型模式:複製的藝術
  6. 06 建造者模式:一步步完成複雜任務
  7. 07 介面卡模式:讓不相容也能合作
  8. 08 橋接模式:抽象與實作分離
  9. 09 組合模式:樹狀結構的好幫手
  10. 10 裝飾者模式:讓功能自由加點
  11. 11 外觀模式:化繁為簡
  12. 12 享元模式:節省記憶體的利器
  13. 13 代理模式:控制存取的守門員
  14. 14 責任鏈模式:層層把關的處理機制
  15. 15 命令模式:靈活封裝的請求指令
  16. 16 解譯器模式:讓程式聽懂你的指令
  17. 17 迭代器模式:輕鬆遍歷集合元素 目前閱讀
  18. 18 中介者模式:管理複雜溝通的好幫手
  19. 19 備忘錄模式:保存與恢復物件狀態
  20. 20 觀察者模式:即時通知的好幫手
  21. 21 狀態模式:依狀態改變行為的祕訣
  22. 22 策略模式:靈活切換行為的好幫手
  23. 23 模板方法模式:固定流程靈活實作
  24. 24 訪問者模式:新增功能不動既有架構

Further reading

中介者模式:管理複雜溝通的好幫手 封面圖 2025-06-13 中介者模式:管理複雜溝通的好幫手 備忘錄模式:保存與恢復物件狀態 封面圖 2025-06-13 備忘錄模式:保存與恢復物件狀態 模板方法模式:固定流程靈活實作 封面圖 2025-06-13 模板方法模式:固定流程靈活實作

留言討論

用 GitHub 帳號留言,留言會同步到這個 Blog 的 GitHub Discussions。

閱讀導覽

約 2 分鐘

本篇所在系列 · 第 17 / 24 篇

設計模式

  1. 搞懂設計模式到底是什麼?
  2. 單例模式:只要一個就夠!
  3. 工廠方法模式:點披薩不用親自下廚
  4. 抽象工廠模式:系列產品輕鬆生產
  5. 原型模式:複製的藝術
  6. 建造者模式:一步步完成複雜任務
  7. 介面卡模式:讓不相容也能合作
  8. 橋接模式:抽象與實作分離
  9. 組合模式:樹狀結構的好幫手
  10. 裝飾者模式:讓功能自由加點
  11. 外觀模式:化繁為簡
  12. 享元模式:節省記憶體的利器
  13. 代理模式:控制存取的守門員
  14. 責任鏈模式:層層把關的處理機制
  15. 命令模式:靈活封裝的請求指令
  16. 解譯器模式:讓程式聽懂你的指令
  17. 迭代器模式:輕鬆遍歷集合元素
  18. 中介者模式:管理複雜溝通的好幫手
  19. 備忘錄模式:保存與恢復物件狀態
  20. 觀察者模式:即時通知的好幫手
  21. 狀態模式:依狀態改變行為的祕訣
  22. 策略模式:靈活切換行為的好幫手
  23. 模板方法模式:固定流程靈活實作
  24. 訪問者模式:新增功能不動既有架構
看完整系列 24 篇