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

解譯器模式:讓程式聽懂你的指令

解譯器模式 (Interpreter Pattern) 用於定義並解析自訂語言。本文透過 C# 文字冒險遊戲範例,教你如何實作指令解析系統。

哈囉各位朋友,今天我們來認識一個有趣又實用的設計模式:解譯器模式(Interpreter),並以好玩的「文字冒險遊戲」為例,輕鬆學會如何讓你的程式讀懂自訂語言或指令。

🌟 解譯器模式是什麼?

解譯器模式是一種用來解析特定語言或表達式的設計模式,它能夠讓你的程式懂得使用者輸入的特定語法或指令,並做出相應的回應或行動。

就像在玩文字冒險遊戲時,你輸入「攻擊 巨龍 使用 火球」,遊戲就能理解你的指令,並做出相應的動作一樣。


🤔 什麼情況適合使用解譯器模式?

  • 需要處理使用者輸入的特殊指令或語法。
  • 想設計一個易於擴充與修改的指令解析系統。
  • 系統需要理解並執行使用者自定義的操作。

🎮 C# 解譯器模式範例(文字冒險遊戲)

以下以文字冒險遊戲為例,示範如何透過解譯器模式解析玩家輸入的指令。

🎲 定義抽象指令介面

/// <summary>
/// 遊戲指令介面
/// </summary>
public interface IGameCommand
{
    /// <summary>
    /// 執行指令
    /// </summary>
    void Execute();
}

⚔️ 建立具體指令

using System;

/// <summary>
/// 攻擊指令
/// </summary>
public class AttackCommand : IGameCommand
{
    private readonly string _target;  // 攻擊目標
    private readonly string _weapon;  // 使用武器

    public AttackCommand(string target, string weapon)
    {
        _target = target;
        _weapon = weapon;
    }

    /// <inheritdoc />
    public void Execute()
    {
        Console.WriteLine($"你使用{_weapon}攻擊了{_target}!");
    }
}

/// <summary>
/// 移動指令
/// </summary>
public class MoveCommand : IGameCommand
{
    private readonly string _direction;  // 移動方向

    public MoveCommand(string direction)
    {
        _direction = direction;
    }

    /// <inheritdoc />
    public void Execute()
    {
        Console.WriteLine($"你往{_direction}移動了。");
    }
}

🗺️ 建立指令解譯器

using System;

/// <summary>
/// 遊戲指令解譯器
/// </summary>
public static class GameCommandInterpreter
{
    /// <summary>
    /// 解析文字指令並回傳對應的 <see cref="IGameCommand"/>
    /// </summary>
    /// <param name="commandText">玩家輸入的指令文字</param>
    /// <returns>解析後的遊戲指令</returns>
    /// <exception cref="InvalidOperationException">指令格式錯誤時擲出</exception>
    public static IGameCommand Interpret(string commandText)
    {
        var parts = commandText.Split(' ');

        switch (parts[0])
        {
            case "攻擊":
                // 期待格式:攻擊 目標 使用 武器
                return new AttackCommand(parts[1], parts[3]);
            case "移動":
                // 期待格式:移動 方向
                return new MoveCommand(parts[1]);
            default:
                throw new InvalidOperationException("無法識別的指令");
        }
    }
}

🚀 實際使用範例

using System;

class Program
{
    static void Main(string[] args)
    {
        // 解析並執行兩個不同的指令
        var command1 = GameCommandInterpreter.Interpret("攻擊 巨龍 使用 火球");
        var command2 = GameCommandInterpreter.Interpret("移動 北方");

        command1.Execute();
        command2.Execute();
    }
}

🎯 執行結果

你使用火球攻擊了巨龍!
你往北方移動了。

⚠️ 解譯器模式使用注意事項

  • 優點:易於擴展和修改語法規則,增加新功能輕鬆方便。
  • 缺點:當指令或語法過於複雜時,可能使系統變得難以維護。

🎉 結語

恭喜你輕鬆掌握了解譯器模式(Interpreter)!透過這個模式,你能讓程式理解並執行玩家輸入的特殊指令,輕鬆實現靈活且互動性高的遊戲或應用程式。

記得繼續追蹤設計模式系列喔,下篇再見啦~

系列:

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

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

還有疑問

Learning path

設計模式

這篇是系列中的第 16 / 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。

閱讀導覽

約 3 分鐘

本篇所在系列 · 第 16 / 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 篇