定义
解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
在解释器模式中由于语法是由很多类表示的,当语法规则更改时,只需修改相应的非终结符表达式即可;若扩展语法时,只需添加相应非终结符类即可。
特征:为了解释一种语言,而为语言创建的解释器。
实现
给出一个运算表达式,根据解释器模式计算出相应的结果
类结构图

数字计算解释器接口 IArithmeticInterpreter
public interface IArithmeticInterpreter {
int interpret();
}
解释器统一抽象类 Interpreter
public abstract class Interpreter implements IArithmeticInterpreter {
protected IArithmeticInterpreter left;
protected IArithmeticInterpreter right;
public Interpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {
this.left = left;
this.right = right;
}
}
加法解释器 AddInterpreter
public class AddInterpreter extends Interpreter {
public AddInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {
super(left, right);
}
@Override
public int interpret() {
return this.left.interpret() + this.right.interpret();
}
}
减法解释器 SubInterpreter
public class SubInterpreter extends Interpreter {
public SubInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {
super(left, right);
}
@Override
public int interpret() {
return this.left.interpret() - this.right.interpret();
}
}
乘法解释器 MultiInterpreter
public class MultiInterpreter extends Interpreter {
public MultiInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {
super(left, right);
}
@Override
public int interpret() {
return this.left.interpret() * this.right.interpret();
}
}
除法解释器 DivInterpreter
public class DivInterpreter extends Interpreter {
public DivInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right) {
super(left, right);
}
@Override
public int interpret() {
return this.left.interpret() / this.right.interpret();
}
}
数字值解析器 NumInterpreter
public class NumInterpreter implements IArithmeticInterpreter {
private int value;
public NumInterpreter(int value) {
this.value = value;
}
@Override
public int interpret() {
return this.value;
}
}
计算器入口 SelfCalculator
public class SelfCalculator {
private Stack<IArithmeticInterpreter> stack = new Stack<>();
public SelfCalculator(String expression) {
parse(expression);
}
private void parse(String expression) {
String[] elements = expression.split(" ");
IArithmeticInterpreter left, right;
for (int i = 0; i < elements.length; i++) {
String operator = elements[i];
if (OperatorUtil.ifOperator(operator)) {
left = this.stack.pop();
right = new NumInterpreter(Integer.valueOf(elements[++i]));
System.out.println("出栈" + left.interpret() + "和" + right.interpret());
this.stack.push(OperatorUtil.getInterpreter(left, right, operator));
System.out.println("应用运算符:" + operator);
} else {
NumInterpreter numInterpreter = new NumInterpreter(Integer.valueOf(elements[i]));
stack.push(numInterpreter);
System.out.println("入栈:" + numInterpreter.interpret());
}
}
}
public int calculate() {
return this.stack.pop().interpret();
}
}
操作符工具类 OperatorUtil
public class OperatorUtil {
public static boolean ifOperator(String symbol) {
return symbol.equals("+") || symbol.equals("-") || symbol.equals("*") || symbol.equals("/");
}
public static Interpreter getInterpreter(IArithmeticInterpreter left, IArithmeticInterpreter right,String symbol) {
if (symbol.equals("+")) {
return new AddInterpreter(left, right);
} else if (symbol.equals("-")) {
return new SubInterpreter(left, right);
} else if (symbol.equals("*")) {
return new MultiInterpreter(left, right);
} else if (symbol.equals("/")) {
return new DivInterpreter(left, right);
}
return null;
}
}
测试 Test
public class Test {
public static void main(String[] args) {
String expression = "10 + 40 - 20";
int resultCalculate = new SelfCalculator(expression).calculate();
System.err.println("表达式:" + expression);
System.err.println("计算结果:"+resultCalculate);
}
}

《 完 》

文章转载自TC 谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




