一、基础简介
1、定义
给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。
2、使用场景
- 1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
- 2、一些重复出现的问题可以用一种简单的语言来进行表达。
- 3、一个简单语法需要解释的场景。
3、优缺点
优点: 1、可扩展性比较好,灵活。 2、增加了新的解释表达式的方式。 3、易于实现简单文法。
缺点: 1、可利用场景比较少。 2、对于复杂的文法比较难维护。 3、解释器模式会引起类膨胀。 4、解释器模式采用递归调用方法,递归是不推荐使用的。
4、模式结构分析
- ** AbstractExpression(抽象表达式)**:在抽象表达式中声明了抽象的解释操作,它是所有终结符表达式和非终结符表达式的公共父类。
- TerminalExpression(终结符表达式):终结符表达式是抽象表达式的子类,它实现了与文法中的终结符相关联的解释操作,在句子中的每一个终结符都是该类的一个实例。通常在一个解释器模式中只有少数几个终结符表达式类,它们的实例可以通过非终结符表达式组成较为复杂的句子。
- NonterminalExpression(非终结符表达式):非终结符表达式也是抽象表达式的子类,它实现了文法中非终结符的解释操作,由于在非终结符表达式中可以包含终结符表达式,也可以继续包含非终结符表达式,因此其解释操作一般通过递归的方式来完成。
- Context(环境类):环境类又称为上下文类,它用于存储解释器之外的一些全局信息,通常它临时存储了需要解释的语句。
二、实例实现
1、实例场景
比如做一个“加法/减法”的通用工具
2、AbstractExpression(抽象表达式)
package com.mfc.design.解释器模式.四则混合运算;
/**
* @author MouFangCai
* @date 2019/10/28 11:01
*
* @description AbstractExpression(抽象表达式)
*/
public abstract class Expression {
/**
* 以环境为准,本方法解释给定的任何一个表达式
*/
public abstract int interpret(Context ctx);
/**
* 将表达式转换成字符串
*/
public abstract String toString();
}
3、NonterminalExpression(非终结符表达式)
加法:
package com.mfc.design.解释器模式.四则混合运算;
/**
* @author MouFangCai
* @date 2019/10/28 11:01
*
* @description NonterminalExpression(非终结符表达式)
*/
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(非终结符表达式)
*/
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(终结符表达式)
package com.mfc.design.解释器模式.四则混合运算;
/**
* @author MouFangCai
* @date 2019/10/28 11:01
*
* @description TerminalExpression(终结符表达式)
*/
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(环境类):环境类又称为上下文类
package com.mfc.design.解释器模式.四则混合运算;
/**
* @author MouFangCai
* @date 2019/10/28 11:01
*
* @description Context(环境类):环境类又称为上下文类
*/
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、结果展示
((3 + 2) - (4 - 1))=2
Process finished with exit code 0