一、定义与类型:
》定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
》为了解释一种语言,二位语言创建的解释器。
》类型:行为型
二、适用场景:
》某个特定类型问题发生频率足够高;
一般使用开源包。
三、解释器模式优点:
》语法由很多类表示,容易改变及扩展此“语言”;
四、缺点:
》当语法规则数目太多时,增加了系统复杂度,现实中使用率极低。
五、相关模式:
解释器模式和适配器模式。
六、代码实践:
package pattern.behaviral.interprator;
/**
* Created by Administrator on 2019/8/25.
*/
public interface Interpreter {
int interpret();
}
package pattern.behaviral.interprator;
/**
* Created by Administrator on 2019/8/25.
*/
public class AddInterpreter implements Interpreter{
private Interpreter firstExpression,secondExpression;
public AddInterpreter(Interpreter firstExpression,Interpreter secondExpression){
this.firstExpression = firstExpression;
this.secondExpression = secondExpression;
}
public int interpret() {
return this.firstExpression.interpret()+this.secondExpression.interpret();
}
@Override
public String toString() {
return "+";
}
}
package pattern.behaviral.interprator;
/**
* Created by Administrator on 2019/8/25.
*/
public class MultiInterpreter implements Interpreter {
private Interpreter firstExpression,secondExpression;
public MultiInterpreter(Interpreter firstExpression,Interpreter secondExpression){
this.firstExpression = firstExpression;
this.secondExpression = secondExpression;
}
public int interpret() {
return this.firstExpression.interpret()*this.secondExpression.interpret();
}
@Override
public String toString() {
return "*";
}
}
package pattern.behaviral.interprator;
/**
* Created by Administrator on 2019/8/25.
*/
public class OperatorUtil {
public static boolean isOperator(String symbol){
return (symbol.equals("+") || symbol.equals("*"));
}
public static Interpreter getExpressionObject(Interpreter firstInterpreter,Interpreter secondInterpreter,String symbol){
if (symbol.equals("+")){
return new AddInterpreter(firstInterpreter,secondInterpreter);
}else if(symbol.equals("*")){
return new MultiInterpreter(firstInterpreter,secondInterpreter);
}
return null;
}
}
package pattern.behaviral.interprator;
/**
* Created by Administrator on 2019/8/25.
*/
public class NumberInterpreter implements Interpreter {
private int number;
public NumberInterpreter(int number){
this.number = number;
}
public NumberInterpreter(String number){
this.number = Integer.parseInt(number);
}
public int interpret() {
return this.number;
}
}
package pattern.behaviral.interprator;
import com.sun.deploy.util.StringUtils;
import java.util.Stack;
/**
* Created by Administrator on 2019/8/25.
*/
public class GeelyExpressionParser {
private Stack<Interpreter> stack = new Stack<Interpreter>();
public int parse(String str) {
String[] strItemArray = str.split(" ");
for (String symbol : strItemArray) {
if (!OperatorUtil.isOperator(symbol)) {
Interpreter numberExpression = new NumberInterpreter(symbol);
stack.push(numberExpression);
System.out.println(String.format("入栈:%d", numberExpression.interpret()));
} else {
//是运算符号可以计算
Interpreter firstExpression = stack.pop();
Interpreter secondExpression = stack.pop();
System.out.println(String.format("出栈:%d 和 %d",
firstExpression.interpret(),
secondExpression.interpret()));
Interpreter operator = OperatorUtil.getExpressionObject(firstExpression, secondExpression, symbol);
System.out.println(String.format("应用运算符:%s", operator.interpret()));
int result = operator.interpret();
NumberInterpreter resultExpression = new NumberInterpreter(result);
stack.push(resultExpression);
System.out.println(String.format("阶段结果入栈:%d", resultExpression.interpret()));
}
}
int result = stack.pop().interpret();
return result;
}
}
package pattern.behaviral.interprator;
/**
* Created by Administrator on 2019/8/25.
*/
public class Test {
public static void main(String[] args) {
String geelyInputStr = "6 100 11 + *";
GeelyExpressionParser expressionParser = new GeelyExpressionParser();
int result = expressionParser.parse(geelyInputStr);
System.out.println("解释器计算结果:"+ result);
}
}
"D:\Program Files\Java\jdk1.8.0_102\bin\java" "-javaagent:D:\InteliijIDea\IntelliJ IDEA 2017.1.4\lib\idea_rt.jar=51167:D:\InteliijIDea\IntelliJ IDEA 2017.1.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_102\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar;E:\JavaDesignMode\target\classes" pattern.behaviral.interprator.Test
入栈:6
入栈:100
入栈:11
出栈:11 和 100
应用运算符:111
阶段结果入栈:111
出栈:111 和 6
应用运算符:666
阶段结果入栈:666
解释器计算结果:666
Process finished with exit code 0
七、jdk中的源码:
jdk中的正则表达式Pattern
spring中的el表达式 SpelExpressionParser Expression 类可以查看下,parseExpression()方法可以注意下