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

Java 設計模式:解釋器模式深度解析與四則運算實作

     編輯:Java 相關知識

解釋器模式為語言文法定義表達式並提供解釋器,適用於「文法簡單、需頻繁擴充規則」的場景(如 SQL 解析、規則引擎、四則運算)。本文完整展示抽象表達式、終結符/非終結符表達式、Context 環境角色,並以 (a*b)/(a-b+2) 為例實作完整解析樹與計算邏輯。

四大核心角色

  • AbstractExpression:宣告 interpret(Context) 抽象方法。
  • TerminalExpression:終結符(變數、常數),對應文法葉節點。
  • NonterminalExpression:非終結符(運算子 + - * /),持有左右子表達式,遞迴解釋。
  • Context:儲存變數對應值(通常用 Map)。

四則運算完整實作

// Context:變數值存儲
class Context {
    private final Map<Variable, Integer> values = new HashMap<>();
    void assign(Variable v, int val) { values.put(v, val); }
    int lookup(Variable v) { return values.get(v); }
}

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

// 終結符:常數
class Constant extends Expression {
    private final int value;
    Constant(int v) { value = v; }
    int interpret(Context ctx) { return value; }
}

// 終結符:變數
class Variable extends Expression {
    int interpret(Context ctx) { return ctx.lookup(this); }
}

// 非終結符:加減乘除
class Add extends Expression {
    private final Expression left, right;
    Add(Expression l, Expression r) { left = l; right = r; }
    int interpret(Context ctx) { return left.interpret(ctx) + right.interpret(ctx); }
}
class Subtract extends Expression { /* 類似,left - right */ }
class Multiply extends Expression { /* 類似,left * right */ }
class Division extends Expression {
    int interpret(Context ctx) {
        try { return left.interpret(ctx) / right.interpret(ctx); }
        catch (ArithmeticException e) { System.out.println("除數為零"); return -11111; }
    }
}

// Client:建構 (a*b)/(a-b+2)
public class Test {
    public static void main(String[] args) {
        Context ctx = new Context();
        Variable a = new Variable(), b = new Variable();
        Constant two = new Constant(2);
        ctx.assign(a, 5); ctx.assign(b, 7);

        Expression exp = new Division(
            new Multiply(a, b),
            new Add(new Subtract(a, b), two)
        );
        System.out.println("結果:" + exp.interpret(ctx)); // (5*7)/(5-7+2) = 35/0 → 例外處理
    }
}

優缺點與適用場景

優點缺點
擴充文法規則只需新增非終結符類別規則複雜時類別爆炸,維護困難
文法表示清晰,易於理解遞迴調用效能差,不適合高效能場景

適用:簡單 SQL 解析、正則表達式引擎、數學公式計算器、DSL 解釋器。
不適用:複雜程式語言編譯器、高頻交易計算路徑。

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