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的子类。