定義(From百度百科): Interpreter(解釋器)模式是一種特殊的設計模式,它建立一個解釋器(Interpreter),對於特定的電腦程式設計語言,用來解釋預先定義的文法。簡單地說,Interpreter模式是一種簡單的語法解釋器構架。 UML類圖: 抽象具體代碼: 模塊說明:Abstr ...
定義(From百度百科):
Interpreter(解釋器)模式是一種特殊的設計模式,它建立一個解釋器(Interpreter),
對於特定的電腦程式設計語言,用來解釋預先定義的文法。
簡單地說,Interpreter模式是一種簡單的語法解釋器構架。
UML類圖:
抽象具體代碼:
public class Client { public static void main(String[] args) { // } } public class Context { } public abstract class AbstractExpression { abstract void interpret(); } public class NonTerminal { } public class Terminal { } 好吧這隻是解釋器模式的代碼骨架 在此引用下wiki上的例子(不得不吐槽,就單獨技術上,wiki比百度解釋的不知道詳細多少) expression ::= plus | minus | variable | number plus ::= expression expression '+' minus ::= expression expression '-' variable ::= 'a' | 'b' | 'c' | ... | 'z' digit = '0' | '1' | ... | '9' number ::= digit | digit number interface Expression { public int interpret(final Map<String, Expression> variables); } class Number implements Expression { private int number; public Number(final int number) { this.number = number; } public int interpret(final Map<String, Expression> variables) { return number; } } class Plus implements Expression { Expression leftOperand; Expression rightOperand; public Plus(final Expression left, final Expression right) { leftOperand = left; rightOperand = right; } public int interpret(final Map<String, Expression> variables) { return leftOperand.interpret(variables) + rightOperand.interpret(variables); } } class Minus implements Expression { Expression leftOperand; Expression rightOperand; public Minus(final Expression left, final Expression right) { leftOperand = left; rightOperand = right; } public int interpret(final Map<String, Expression> variables) { return leftOperand.interpret(variables) - rightOperand.interpret(variables); } } class Variable implements Expression { private String name; public Variable(final String name) { this.name = name; } public int interpret(final Map<String, Expression> variables) { if (null == variables.get(name)) return 0; // Either return new Number(0). return variables.get(name).interpret(variables); } } public class InterpreterExample { public static void main(final String[] args) { final String expression = "w x z - +"; final Evaluator sentence = new Evaluator(expression); final Map<String, Expression> variables = new HashMap<String, Expression>(); variables.put("w", new Number(5)); variables.put("x", new Number(10)); variables.put("z", new Number(42)); final int result = sentence.interpret(variables); System.out.println(result); } }
模塊說明:
AbstractExpression(抽象表達式):在抽象表達式中聲明瞭抽象的解釋操作,它是所有終結符表達式和非終結符表達式的公共父類。
Terminal(終結符表達式):終結符表達式是抽象表達式的子類,它實現了與文法中的終結符相關聯的解釋操作,在句子中的每一個終結符都是該類的一個實例。
通常在一個解釋器模式中只有少數幾個終結符表達式類,它們的實例可以通過非終結符表達式組成較為複雜的句子。
NonTerminal(非終結符表達式):非終結符表達式也是抽象表達式的子類,它實現了文法中非終結符的解釋操作,由於在非終結符表達式中可以包含終結符表達式,
也可以繼續包含非終結符表達式,因此其解釋操作一般通過遞歸的方式來完成。
Context(環境類):環境類又稱為上下文類,它用於存儲解釋器之外的一些全局信息,通常它臨時存儲了需要解釋的語句。
應用場景:
正如百度所言,正則表達式
優缺點:
優點:
易於改變和擴展文法
每一條文法規則都可以表示為一個類,因此可以方便地實現一個簡單的語言
實現文法較為容易
增加新的解釋表達式較為方便
缺點:
對於複雜文法難以維護
執行效率較低
總結:
分離實現,解釋執行
吐槽:大部分我也不大明白,亂...,先留下個坑吧,希望有天把這句話去掉