1、概念
解釋器模式給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來(lái)解釋語(yǔ)言中的句子,屬于行為型模式。但其在實(shí)際的系統(tǒng)開(kāi)發(fā)中使用的很少,因?yàn)樗麜?huì)引起效率、性能以及維護(hù)等問(wèn)題

解釋器模式
2、模式結(jié)構(gòu)
- 抽象解釋器(AbstractExpression):聲明一個(gè)所有的具體表達(dá)式角色都需要實(shí)現(xiàn)的抽象接口。這個(gè)接口主要是一個(gè)interpret()方法,稱作解釋操作
- 終結(jié)符表達(dá)式(TerminalExpression):實(shí)現(xiàn)了抽象表達(dá)式角色所要求的接口,主要是一個(gè)interpret()方法;文法中的每一個(gè)終結(jié)符都有一個(gè)具體終結(jié)表達(dá)式與之相對(duì)應(yīng)
- 非終結(jié)符表達(dá)式(NonterminalExpression):文法中的每一條規(guī)則都需要一個(gè)具體的非終結(jié)符表達(dá)式,非終結(jié)符表達(dá)式一般是文法中的運(yùn)算符或者其他關(guān)鍵
- 環(huán)境類(Context):用來(lái)存放文法中各個(gè)終結(jié)符所對(duì)應(yīng)的具體值
3、使用場(chǎng)景
- 可以將一個(gè)需要解釋執(zhí)行的語(yǔ)言中的句子表示為一個(gè)抽象語(yǔ)法樹(shù)
- 一些重復(fù)出現(xiàn)的問(wèn)題可以用一種簡(jiǎn)單的語(yǔ)言來(lái)進(jìn)行表達(dá)
- 一個(gè)簡(jiǎn)單語(yǔ)法需要解釋的場(chǎng)景
4、優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 可擴(kuò)展性比較好,靈活
- 增加了新的解釋表達(dá)式的方式
- 易于實(shí)現(xiàn)文法
缺點(diǎn):
- 可利用場(chǎng)景比較少
- 對(duì)于復(fù)雜的文法比較難維護(hù)
- 解釋器模式會(huì)引起類膨脹
- 解釋器模式采用遞歸調(diào)用方法
5、實(shí)例
定義環(huán)境類Context
public class Context {
private Map<Expression, Integer> valueMap;
public Context() {
this.valueMap = new HashMap<>();
}
public void addValue(Expression ex, Integer value) {
valueMap.put(ex, value);
}
public int getValue(Expression ex) {
if (valueMap.containsKey(ex)) {
return valueMap.get(ex);
}
return 0;
}
}
定義抽象解釋器Expression
public interface Expression {
int interpreter(Context context);
}
定義終結(jié)符表達(dá)式TerminalExpression
public class TerminalExpression implements Expression {
private int number;
public TerminalExpression(int number) {
this.number = number;
}
@Override
public int interpreter(Context context) {
return number;
}
}
定義終結(jié)符表達(dá)式VariableExpression
public class VariableExpression implements Expression {
@Override
public int interpreter(Context context) {
return context.getValue(this);
}
}
定義非終結(jié)符表達(dá)式MinusExpression
public class MinusExpression implements Expression {
private Expression left;
private Expression right;
public MinusExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
@Override
public int interpreter(Context context) {
return left.interpreter(context) - right.interpreter(context);
}
}
定義非終結(jié)符表達(dá)式AddExpression
public class AddExpression implements Expression {
private Expression left;
private Expression right;
public AddExpression(Expression left, Expression right) {
this.left = left;
this.right = right;
}
@Override
public int interpreter(Context context) {
return left.interpreter(context) + right.interpreter(context);
}
}
客戶端使用
Context context = new Context();
VariableExpression x = new VariableExpression();
VariableExpression y = new VariableExpression();
TerminalExpression terminal = new TerminalExpression(100);
context.addValue(x, 20);
context.addValue(y, 50);
Expression expression = new AddExpression(new MinusExpression(x, y), terminal);
System.out.println("Result = " + expression.interpreter(context));