文章目录
- 1、解释器模式
- 2、案例
1、解释器模式
计算一个表达式的值,比如1+2-3+4-7,单纯的定义方法或函数很难适配所有,因为数值和运算符可以有无数种组合。
//用于n个整数相加
public static int add(Integer ... arr) {int sum = 0;for (Integer i : arr) {sum += i;}return sum;
}
如果把运算符和数字看作一个个节点,逐个去读取和解析,则可适配所有。即定义一个解释器去解释表达式。解释器模式常用于SQL解析、符号处理引擎。主要角色:
- 抽象表达式类:接口,定义解释操作,包含一个interpret方法
- 终结符表达式类:下例中的变量或者值
- 非终结表达式类:下例中的运算符(加法、减法)
- 环境角色:传递被解释器共享的数据,解释器从这里获取值
2、案例
定义抽象表达式类,定义一个解释的方法,聚合环境类对象
//抽象角色AbstractExpression
public abstract class AbstractExpression {public abstract int interpret(Context context);
}
定义终结符表达式(变量类)
//终结符表达式角色 变量表达式
public class Variable extends AbstractExpression {private String name;public Variable(String name) {this.name = name;}@Overridepublic int interpret(Context ctx) {return ctx.getValue(this);}@Overridepublic String toString() {return name;}
}
//终结符表达式角色
public class Value extends AbstractExpression {private int value; public Value(int value) {this.value = value;}@Overridepublic int interpret(Context context) {return value;}@Overridepublic String toString() {return new Integer(value).toString();}
}
将左边表达式和右边表达式的结果相加
//非终结符表达式角色 加法表达式
public class Plus extends AbstractExpression {private AbstractExpression left; //+号左边的表达式private AbstractExpression right; // +号右边的表达式public Plus(AbstractExpression left, AbstractExpression right) {this.left = left;this.right = right;}@Overridepublic int interpret(Context context) {//将左边表达式和右边表达式的结果相加return left.interpret(context) + right.interpret(context);}@Overridepublic String toString() {return "(" + left.toString() + " + " + right.toString() + ")";}
}
//非终结符表达式角色 减法表达式
public class Minus extends AbstractExpression {private AbstractExpression left;private AbstractExpression right;public Minus(AbstractExpression left, AbstractExpression right) {this.left = left;this.right = right;}@Overridepublic int interpret(Context context) {//将左边表达式和右边表达式的结果相减return left.interpret(context) - right.interpret(context);}@Overridepublic String toString() {return "(" + left.toString() + " - " + right.toString() + ")";}
}
环境角色类,定义一个Map集合,用来存储变量及对应的值
//环境类
public class Context {private Map<Variable, Integer> map = new HashMap<Variable, Integer>();//添加变量的功能public void assign(Variable var, Integer value) {map.put(var, value);}public int getValue(Variable var) {Integer value = map.get(var);return value;}
}
测试类:
//测试类
public class Client {public static void main(String[] args) {//创建环境对象Context context = new Context();Variable a = new Variable("a");Variable b = new Variable("b");Variable c = new Variable("c");Variable d = new Variable("d");Variable e = new Variable("e");//Value v = new Value(1);context.assign(a, 1);context.assign(b, 2);context.assign(c, 3);context.assign(d, 4);context.assign(e, 5);//获取抽象语法树对象AbstractExpression expression = new Minus(new Plus(new Plus(new Plus(a, b), c), d), e);//解释(计算)System.out.println(expression + "= " + expression.interpret(context));}
}