解釋器模式定義了一種語言的文法表示,並提供一個解釋器來處理該語言中的句子。雖然使用頻率較低,但在處理固定文法、重複出現、需動態解析的問題時(如 SQL 解析、規則引擎、數學表達式計算),它提供了極佳的擴展性。
interpret(Context) 接口,規範解釋行為。Map 實現。abstract class Expression {
public abstract Object interpret(Context ctx);
}
class TerminalExpression extends Expression {
public Object interpret(Context ctx) { /* 解析變量/常數 */ }
}
class NonterminalExpression extends Expression {
private Expression left, right;
public NonterminalExpression(Expression l, Expression r) { left=l; right=r; }
public Object interpret(Context ctx) {
return operate(left.interpret(ctx), right.interpret(ctx)); // 遞歸組合
}
}
class Context { Map<String, Object> vars = new HashMap<>(); }
客戶端將輸入字串轉為語法樹,再調用根節點 interpret() 遞歸求值。
| 優點 | 缺點 |
|---|---|
| 文法易擴展:新增規則只需加非終結符類 | |
| 類爆炸:複雜文法產生大量類,維護困難 | |
| 實現簡單,符合開閉原則 | 遞歸調用效率低,不適合長複雜語句 |
| 易於實現語法驗證與錯誤提示 | 調試困難,調用棧深且分散 |
解釋器模式是「語言實現」的入門級模式,適合教學與輕量級 DSL。工程實踐中,面對複雜文法請擁抱專業解析器框架,將精力集中在業務邏輯而非語法分析本身。