行为设计模式 - 解释器设计模式
解释器设计模式是行为设计模式之一。解释器模式用于定义语言的语法表示,并提供解释器来处理该语法。
解释器设计模式
解释器设计模式的最佳示例是java编译器,它将java源代码解释为JVM可理解的字节代码。Google Translator也是解释器模式的一个示例,其中输入可以是任何语言,我们可以使用另一种语言来解释输出。
解释器模式示例
要实现解释器模式,我们需要创建将执行解释工作的Interpreter上下文引擎。
然后我们需要创建不同的Expression实现,这些实现将消耗解释器上下文提供的功能。
最后,我们需要创建客户端,该客户端将从用户获取输入并决定使用哪个Expression,然后为用户生成输出。
让我们通过一个示例来理解这一点,其中用户输入将具有两种形式 - “ <Number> in Binary
”或“ <Number> in Hexadecimal
。”
我们的解释器客户端应该分别以“ <Number> in Binary= <Number_Binary_String>
”和“ <Number> in Hexadecimal= <Number_Binary_String>
” 格式返回它。
我们的第一步是编写将执行实际解释的Interpreter上下文类。
package com.journaldev.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.journaldev.design.interpreter;
public interface Expression {
String interpret(InterpreterContext ic);
}
我们将有两个表达式实现,一个用于将int转换为二进制,另一个用于将int转换为十六进制格式。
package com.journaldev.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.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);
}
}
现在我们可以创建我们的客户端应用程序,该应用程序将具有解析用户输入的逻辑并将其传递给正确的表达式,然后使用输出生成用户响应。
package com.journaldev.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
解释器设计模式示例类图
关于解释器模式的重点
- 当我们可以为我们的语法创建语法树时,可以使用解释器模式。
- 解释器设计模式需要大量的错误检查和大量的表达式和代码来评估它们。当语法变得更复杂并因此难以维护并提供效率时,它变得复杂。
java.util.Pattern
和子类java.text.Format
是JDK中使用的解释器模式的一些示例。
转载来源:https://www.journaldev.com/1635/interpreter-design-pattern-java