一、基礎(chǔ)簡介
1、定義
給定一個語言,定義它的文法表示,并定義一個解釋器,這個解釋器使用該標(biāo)識來解釋語言中的句子。
解釋器模式(Interpreter Pattern)提供了評估語言的語法或表達式的方式,它屬于行為型模式。
2、使用場景
- 1、可以將一個需要解釋執(zhí)行的語言中的句子表示為一個抽象語法樹。
- 2、一些重復(fù)出現(xiàn)的問題可以用一種簡單的語言來進行表達。
- 3、一個簡單語法需要解釋的場景。
3、優(yōu)缺點
優(yōu)點: 1、可擴展性比較好,靈活。 2、增加了新的解釋表達式的方式。 3、易于實現(xiàn)簡單文法。
缺點: 1、可利用場景比較少。 2、對于復(fù)雜的文法比較難維護。 3、解釋器模式會引起類膨脹。 4、解釋器模式采用遞歸調(diào)用方法,遞歸是不推薦使用的。
4、模式結(jié)構(gòu)分析
- ** AbstractExpression(抽象表達式)**:在抽象表達式中聲明了抽象的解釋操作,它是所有終結(jié)符表達式和非終結(jié)符表達式的公共父類。
- TerminalExpression(終結(jié)符表達式):終結(jié)符表達式是抽象表達式的子類,它實現(xiàn)了與文法中的終結(jié)符相關(guān)聯(lián)的解釋操作,在句子中的每一個終結(jié)符都是該類的一個實例。通常在一個解釋器模式中只有少數(shù)幾個終結(jié)符表達式類,它們的實例可以通過非終結(jié)符表達式組成較為復(fù)雜的句子。
- NonterminalExpression(非終結(jié)符表達式):非終結(jié)符表達式也是抽象表達式的子類,它實現(xiàn)了文法中非終結(jié)符的解釋操作,由于在非終結(jié)符表達式中可以包含終結(jié)符表達式,也可以繼續(xù)包含非終結(jié)符表達式,因此其解釋操作一般通過遞歸的方式來完成。
- Context(環(huán)境類):環(huán)境類又稱為上下文類,它用于存儲解釋器之外的一些全局信息,通常它臨時存儲了需要解釋的語句。
二、實例實現(xiàn)
1、實例場景
比如做一個“加法/減法”的通用工具
2、AbstractExpression(抽象表達式)
package com.mfc.design.解釋器模式.四則混合運算;
/**
* @author MouFangCai
* @date 2019/10/28 11:01
*
* @description AbstractExpression(抽象表達式)
*/
public abstract class Expression {
/**
* 以環(huán)境為準(zhǔn),本方法解釋給定的任何一個表達式
*/
public abstract int interpret(Context ctx);
/**
* 將表達式轉(zhuǎn)換成字符串
*/
public abstract String toString();
}
3、NonterminalExpression(非終結(jié)符表達式)
加法:
package com.mfc.design.解釋器模式.四則混合運算;
/**
* @author MouFangCai
* @date 2019/10/28 11:01
*
* @description NonterminalExpression(非終結(jié)符表達式)
*/
public class Plus extends Expression {
private Expression left,right;
public Plus(Expression left , Expression right){
this.left = left;
this.right = right;
}
@Override
public int interpret(Context ctx) {
return left.interpret(ctx) + right.interpret(ctx);
}
@Override
public String toString() {
return "(" + left.toString() + " + " + right.toString() + ")";
}
}
減法:
package com.mfc.design.解釋器模式.四則混合運算;
/**
* @author MouFangCai
* @date 2019/10/28 11:04
*
* @description NonterminalExpression(非終結(jié)符表達式)
*/
public class Minus extends Expression {
private Expression left, right;
public Minus(Expression left, Expression right) {
this.left = left;
this.right = right;
}
@Override
public int interpret(Context ctx) {
return left.interpret(ctx) - right.interpret(ctx);
}
@Override
public String toString() {
return "(" + left.toString() + " - " + right.toString() + ")";
}
}
4、TerminalExpression(終結(jié)符表達式)
package com.mfc.design.解釋器模式.四則混合運算;
/**
* @author MouFangCai
* @date 2019/10/28 11:01
*
* @description TerminalExpression(終結(jié)符表達式)
*/
public class Constant extends Expression {
private int value;
public Constant(int value){
this.value = value;
}
@Override
public int interpret(Context ctx) {
return value;
}
@Override
public String toString() {
return new Integer(value).toString();
}
}
5、Context(環(huán)境類):環(huán)境類又稱為上下文類
package com.mfc.design.解釋器模式.四則混合運算;
/**
* @author MouFangCai
* @date 2019/10/28 11:01
*
* @description Context(環(huán)境類):環(huán)境類又稱為上下文類
*/
public class Context {
}
6、客戶端
package com.mfc.design.解釋器模式.四則混合運算;
/**
* @author MouFangCai
* @date 2019/10/28 11:04
* @description
*/
public class Client {
public static void main(String[] args) {
Context context = new Context();
Constant c1 = new Constant(1);
Constant c2 = new Constant(2);
Constant c3 = new Constant(3);
Constant c4 = new Constant(4);
Expression exp = new Minus(new Plus(c3, c2), new Minus(c4, c1));
System.out.println(exp.toString() + "=" + exp.interpret(context));
}
}
8、結(jié)果展示
((3 + 2) - (4 - 1))=2
Process finished with exit code 0