本文翻译自:https://www.journaldev.com/1635/interpreter-design-pattern-java
Interpreter Design Pattern
- 解释器模式最好的例子就是Java编译器,它通过JVM将源码编译成字节码文件,谷歌翻译也是一个很好的例子,将我们输入的语言翻译成另一种我们能理解的语言;
Interpreter Pattern Example
-
为了实现解释器模式,我们需要创建一个能够做解释工作的引擎——解释器上下文引擎(Interpreter context engine);
-
然后我们需要创建可以实现解释器上下文(interpreter context)的表达式,这个表达式是多样的,因为输入的形式可能是多样的;
-
最后我们需要创建一个解释器客户端(interpreter client ),它能够决定用何种表达式将用户的输入转换成输出;
-
让我们用一个小例子来理解一下,假如用户使用两种形式输入,一种是:二进制模式数字(<Number> in Binary),另一种是十六进制模式数字(“<Number> in Hexadecimal),然后我们的解释器客户端(interpreter client)对其进行翻译;
-
我们的第一步将会创建一个InterpreterContext 的类,这个类将完成实际的解释工作:
public class InterpreterContext {
//二进制模式转字符串
public String getBinaryFormat(int i){
return Integer.toBinaryString(i);
}
//十六进制模式转字符串
public String getHexadecimalFormat(int i){
return Integer.toHexString(i);
}
}
- 然后我们需要创建一个表达式,它引入了我们创建的InterpreterContext ;
public interface Expression {
String interpret(InterpreterContext ic);
}
- 然后再实现两个Expression 的子类,一个是使用二进制模式将数值转换为字符串,
public class IntToBinaryExpression implements Expression {
private int i;
public IntToBinaryExpression(int c){
this.i=c;
}
@Override
public String interpret(InterpreterContext ic) {
return ic.getBinaryFormat(this.i);
}
}
- 另一个是使用十六进制模式将数值转换为字符串
package com.journaldev.design.interpreter;
public class IntToHexExpression implements Expression {
private int i;
public IntToHexExpression(int c){
this.i=c;
}
@Override
public String interpret(InterpreterContext ic) {
return ic.getHexadecimalFormat(i);
}
}
- 现在可以创建解释器客户端了,它将使用逻辑运算解析用户的输入,将其传递给正确的表达式,然后输出给用户。
public class InterpreterClient {
public InterpreterContext ic;
public InterpreterClient(InterpreterContext i){
this.ic=i;
}
public String interpret(String str){
Expression exp = null;
//create rules for expressions
if(str.contains("Hexadecimal")){
exp=new IntToHexExpression(Integer.parseInt(str.substring(0,str.indexOf(" "))));
}else if(str.contains("Binary")){
exp=new IntToBinaryExpression(Integer.parseInt(str.substring(0,str.indexOf(" "))));
}else return str;
return exp.interpret(ic);
}
public static void main(String args[]){
String str1 = "28 in Binary";
String str2 = "28 in Hexadecimal";
InterpreterClient ec = new InterpreterClient(new InterpreterContext());
System.out.println(str1+"= "+ec.interpret(str1));
System.out.println(str2+"= "+ec.interpret(str2));
}
}
- 可以想象,相同的数字输入,但是如果使用不同的进制编译,将会得到不同的结果:
28 in Binary= 11100
28 in Hexadecimal= 1c
Interpreter Design Pattern Example Class Diagram(UML模型)

Important Points about Interpreter pattern
- 解释器模式能够用于创建语法树;
- 解释器模式需要许多错误案例以及表达式去检验,并且其复杂度会随着语法的复杂变得越来越难以维护;
- java.util.Pattern and java.text.Format 是JDK中最好的实践;
网友评论