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

行為型設計模式:Interpreter(解釋器)模式完整指南

     編輯:關於C++

1. 意圖

給定一個語言,定義其文法表示,並定義一個解釋器,使用該表示解釋語言中的句子。

2. 適用性

  • 有簡單文法需解釋執行,且句子可表示為抽象語法樹(AST)。
  • 文法簡單:復雜文法類層次龐大難管理,建議用語法分析器生成器。
  • 效率非關鍵:最高效解釋器通常將 AST 轉換為其他形式(如狀態機)。

3. 結構角色

4. 代碼示例:簡易加減法解釋器(Java)

// 抽象表達式
interface Expression {
    int interpret(Context ctx);
}

// 終結符:變量/常數
class NumberExpression implements Expression {
    private int value;
    public NumberExpression(int v) { value = v; }
    public int interpret(Context ctx) { return value; }
}

// 非終結符:加法
class PlusExpression implements Expression {
    private Expression left, right;
    public PlusExpression(Expression l, Expression r) { left = l; right = r; }
    public int interpret(Context ctx) { return left.interpret(ctx) + right.interpret(ctx); }
}

// 非終結符:減法
class MinusExpression implements Expression {
    private Expression left, right;
    public MinusExpression(Expression l, Expression r) { left = l; right = r; }
    public int interpret(Context ctx) { return left.interpret(ctx) - right.interpret(ctx); }
}

// 上下文(本例簡單,無狀態)
class Context {}

// 構建 AST: 9 + 2 - 8
public class Test {
    public static void main(String[] args) {
        Expression expr = new MinusExpression(
            new PlusExpression(new NumberExpression(9), new NumberExpression(2)),
            new NumberExpression(8)
        );
        System.out.println(expr.interpret(new Context()));  // 輸出 3
    }
}

5. 相關模式

  • Composite:AST 本質是組合模式。
  • Flyweight:共享終結符節點(如變量名)。
  • Iterator:遍歷 AST 結構。
  • Visitor:在單獨類中維護節點行為(如類型檢查、代碼生成)。

6. 實戰場景

  1. 正則表達式引擎:文法 → NFA/DFA → 匹配。
  2. SQL 解析器:WHERE 子句條件表達式解釋。
  3. 配置文件解析:簡易腳本語言(如 Nginx 配置、遊戲腳本)。
  4. 數學表達式計算器:四則運算、函數調用。

7. 優缺點

角色職責
AbstractExpression(抽象表達式)聲明 interpret(Context) 抽象方法。
TerminalExpression(終結符表達式)實現文法中終結符的解釋。
NonterminalExpression(非終結符表達式)為文法中非終結符實現解釋,遞歸調用子表達式。
Context(上下文)包含解釋器所需的全局信息。
Client(客戶端)構建 AST,調用解釋操作。
優點缺點
易擴展文法(新增表達式類)復雜文法類爆炸,維護困難
易實現新解釋方式(Visitor)效率低,非高性能場景適用
符合開閉原則不適用於動態/上下文敏感文法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved