首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 設計模式實戰:解釋器模式完整解析與羅馬數字轉換案例

     編輯:關於.NET

模式簡介

解釋器模式給定一語言,定義其文法表示,並定義解釋器解釋語言中的句子。使用類別表示文法規則,易於擴展與實作。屬於行為型模式。

適用場景

特定類型問題頻繁出現時,將問題實例表示為簡單語言句子,建構解釋器解析執行。

結構角色

  • AbstractExpression:抽象表達式,宣告 Interpret(Context)
  • TerminalExpression:終結符表達式,實作終結符解釋
  • NonterminalExpression:非終結符表達式,每條文法規則一類別
  • Context:包含解釋器外的全域資訊
解釋器模式結構圖

基礎實作

public abstract class AbstractExpression { public abstract void Interpret(Context context); }
public class TerminalExpression : AbstractExpression {
    public override void Interpret(Context c) => Console.WriteLine("呼叫 Terminal.Interpret");
}
public class NonterminalExpression : AbstractExpression {
    public override void Interpret(Context c) => Console.WriteLine("呼叫 Nonterminal.Interpret");
}
public class Context { }

// Client
static void Main() {
    var ctx = new Context();
    var list = new ArrayList { new TerminalExpression(), new NonterminalExpression(), new TerminalExpression(), new TerminalExpression() };
    foreach (AbstractExpression exp in list) exp.Interpret(ctx);
}
基礎範例執行結果

實戰案例:羅馬數字轉十進位

文法規則:千位(M)、百位(C/CD/D/CM)、十位(X/XL/L/XC)、個位(I/IV/V/IX)。

  • Context:保存輸入字串 Input 與輸出數值 Output
  • Expression 抽象類別:實作通用解析邏輯(九、四、五、一),子類別僅提供符號與倍數
  • 四個終結符類別:ThousandExpression、HundredExpression、TenExpression、OneExpression
羅馬數字解析結構
// Expression 核心解析邏輯
public abstract class Expression {
    public void Interpret(Context ctx) {
        if (ctx.Input.Length == 0) return;
        if (ctx.Input.StartsWith(Nine())) { ctx.Output += 9 * Multiplier(); ctx.Input = ctx.Input.Substring(2); }
        else if (ctx.Input.StartsWith(Four())) { ctx.Output += 4 * Multiplier(); ctx.Input = ctx.Input.Substring(2); }
        else if (ctx.Input.StartsWith(Five())) { ctx.Output += 5 * Multiplier(); ctx.Input = ctx.Input.Substring(1); }
        while (ctx.Input.StartsWith(One())) { ctx.Output += 1 * Multiplier(); ctx.Input = ctx.Input.Substring(1); }
    }
    public abstract string One(); public abstract string Four(); public abstract string Five(); public abstract string Nine(); public abstract int Multiplier();
}

// 千位
class ThousandExpression : Expression {
    public override string One() => "M"; public override string Four() => ""; public override string Five() => ""; public override string Nine() => ""; public override int Multiplier() => 1000;
}
// 百位、十位、個位類似...

// Client
static void Main() {
    string roman = "MCMXXVIII"; // 1928
    var ctx = new Context(roman);
    var tree = new List<Expression> { new ThousandExpression(), new HundredExpression(), new TenExpression(), new OneExpression() };
    foreach (var exp in tree) exp.Interpret(ctx);
    Console.WriteLine($"{roman} = {ctx.Output}");
}
羅馬數字轉換執行結果

總結

解釋器模式適合建構領域特定語言(DSL)、規則引擎、查詢解析器等場景,透過抽象語法樹與遞迴下降解析,實現靈活可擴展的語言處理能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved