模式概述:
解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。
使用场景:
只在一些特定的领域会被用到,比如编译器、规则引擎、正则表达式。
代码样例:
代码背景: 定义一个加减乘除的计算语言;表达式只有加、减、乘、除,且没有优先级;表达式前面是数字,后面是运算符,空格隔开;数字按照从左到右顺序,运算符按照从右到左顺序,取出两个数字和运算符进行计算,计算结果放入头部,循环此过程,直到只剩下一个数字,即为计算结果。比如”5 2 1 - +“;第一次计算,取出 5和2进行加法处理得到7,表达式变成”7 1 -“,再次进行计算,得到最终结果6。
/**
* 解释器
*/
public class Interpreter {
public static void main(String[] args) {
String string = new String("5 2 1 - +");
int result = execute(string);
System.out.println("输入:"+string);
System.out.println("输出:"+result);
}
public static int execute(String string){
int result = 0;
String array[] = string.split(" ");
Deque<Integer> numberList = new LinkedList<>();
if(array.length<=1) throw new RuntimeException();
for (int i=0;i<(array.length+1)/2;i++){
numberList.add(Integer.parseInt(array[i]));
}
for (int j = array.length-1;j>((array.length+1)/2)-1;j--){
String operator = array[j];
boolean isValid = "+".equals(operator) ||
"-".equals(operator) ||
"*".equals(operator) ||
"/".equals(operator);
if (!isValid) {
throw new RuntimeException();
}
int number1 = numberList.pollFirst();
int number2 = numberList.pollFirst();
if("+".equals(operator)){
numberList.addFirst(number1+number2);
}else if("-".equals(operator)){
numberList.addFirst(number1-number2);
}else if("*".equals(operator)){
numberList.addFirst(number1*number2);
}else if("/".equals(operator)){
numberList.addFirst(number1/number2);
}
}
return numberList.pollFirst();
}
}
测试结果: