解釋器模式給定一語言,定義其文法表示,並定義解釋器解釋語言中的句子。使用類別表示文法規則,易於擴展與實作。屬於行為型模式。
特定類型問題頻繁出現時,將問題實例表示為簡單語言句子,建構解釋器解析執行。
Interpret(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 與輸出數值 OutputExpression 抽象類別:實作通用解析邏輯(九、四、五、一),子類別僅提供符號與倍數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)、規則引擎、查詢解析器等場景,透過抽象語法樹與遞迴下降解析,實現靈活可擴展的語言處理能力。