解釋器模式 Interpreter
Intro
解釋器模式,給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
這和解釋型編程語言的解釋器有點類似,要根據一段輸入轉換成一段輸出,將不易讀的文本轉換為易讀的文本,將機器不能識別的輸入轉成二進制機器可讀的輸出
當有一個語言需要解釋執行,並且你可以將該語言中的句子表示為一個抽象語法樹時,可以使用解釋器模式。
Prototype
- Context: 解釋器上下文
- AbstractExpression: 解釋表達式抽象,定義解釋操作
- ConcreteExpression: 解釋表達式實現類,實現具體的解釋邏輯
Sample
public class Context
{
public string Input { get; set; }
public string Output { get; set; }
}
public abstract class AbstractExpression
{
public abstract void Interpret(Context context);
}
public class TerminalExpression : AbstractExpression
{
public override void Interpret(Context context)
{
Console.WriteLine("TerminalExpressionInterpreter");
}
}
public class NoneTerminalExpression : AbstractExpression
{
public override void Interpret(Context context)
{
Console.WriteLine("NonTerminalExpressionInterpreter");
}
}
var context = new Context();
ICollection<AbstractExpression> expressions = new List<AbstractExpression>();
expressions.Add(new TerminalExpression());
expressions.Add(new TerminalExpression());
expressions.Add(new NoneTerminalExpression());
foreach (var expression in expressions)
{
expression.Interpret(context);
}
More
解釋器模式為某個語言定義它的語法(或者叫文法)表示,並定義一個解釋器用來處理這個語法。
要想了解“語言”要表達的信息,我們就必須定義相應的語法規則。這樣,書寫者就可以根據語法規則來書寫“句子”(專業點的叫法應該是“表達式”),閱讀者根據語法規則來閱讀“句子”,這樣才能做到信息的正確傳遞。而我們要講的解釋器模式,其實就是用來實現根據語法規則解讀“句子”的解釋器。
解釋器模式的代碼實現比較靈活,沒有固定的模板。
應用設計模式主要是應對代碼的復雜性,解釋器模式也不例外。它的代碼實現的核心思想,就是將語法解析的工作拆分到各個小類中,以此來避免大而全的解析類。
一般的做法是,將語法規則拆分一些小的獨立的單元,然后對每個單元進行解析,最終合並為對整個語法規則的解析。
解釋器模式可能小眾,只在一些特定的領域或情境下會被用到,比如編譯器、規則引擎、正則表達式等。