Java解释器设计模式
口译员设计模式是行为设计模式之一。
解释器模式用于定义一种语言的语法表示形式,并提供解释器来处理这种语法。
解释器设计模式
解释器设计模式的最佳示例是Java编译器,它将Java源代码解释为JVM可以理解的字节代码。
Google Translator也是解释器模式的一个示例,其中输入可以使用任何语言,而我们可以使用另一种语言来解释输出。
解释器模式示例
要实现解释器模式,我们需要创建解释器上下文引擎来完成解释工作。
然后,我们需要创建不同的Expression实现,这些实现将使用解释器上下文提供的功能。
最后,我们需要创建一个客户端,它将从用户那里获取输入,并确定要使用哪个Expression,然后为用户生成输出。
让我们以一个示例来理解这一点,其中用户输入将采用两种形式–"二进制中的<Number>或者十六进制中的<Number>。
"我们的解释器客户端应分别以"二进制中的<Number> = <Number_Binary_String>"和"十六进制= <Number_Binary_String>"的形式返回它。
我们的第一步将是编写解释器上下文类,该类将进行实际的解释。
package com.theitroad.design.interpreter;
public class InterpreterContext {
public String getBinaryFormat(int i){
return Integer.toBinaryString(i);
}
public String getHexadecimalFormat(int i){
return Integer.toHexString(i);
}
}
现在,我们需要创建不同类型的表达式,这些表达式将使用解释器上下文类。
package com.theitroad.design.interpreter;
public interface Expression {
String interpret(InterpreterContext ic);
}
我们将有两种表达式实现,一种将int转换为二进制,另一种将int转换为十六进制格式。
package com.theitroad.design.interpreter;
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.theitroad.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);
}
}
现在,我们可以创建客户端应用程序,该应用程序将具有逻辑来解析用户输入,并将其传递给正确的表达式,然后使用输出生成用户响应。
package com.theitroad.design.interpreter;
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
关于解释器设计模式说明
当我们可以为已有的语法创建语法树时,可以使用解释器模式。
解释器设计模式需要进行大量的错误检查,并需要大量的表达式和代码来对其进行评估。
当语法变得更加复杂,因此难以维护和提供效率时,它将变得复杂。JDK中使用的解释器模式示例包括java.util.Pattern和java.text.Format的子类。

