Java解释器设计模式

时间:2020-02-23 14:36:17  来源:igfitidea点击:

口译员设计模式是行为设计模式之一。
解释器模式用于定义一种语言的语法表示形式,并提供解释器来处理这种语法。

解释器设计模式

解释器设计模式的最佳示例是Java编译器,它将Java源代码解释为JVM可以理解的字节代码。
Google Translator也是解释器模式的一个示例,其中输入可以使用任何语言,而我们可以使用另一种语言来解释输出。

解释器模式示例

要实现解释器模式,我们需要创建解释器上下文引擎来完成解释工作。

然后,我们需要创建不同的Expression实现,这些实现将使用解释器上下文提供的功能。

最后,我们需要创建一个客户端,它将从用户那里获取输入,并确定要使用哪个Expression,然后为用户生成输出。

让我们以一个示例来理解这一点,其中用户输入将采用两种形式–"二进制中的<Number>或者十六进制中的<Number>。
"我们的解释器客户端应分别以"二进制中的<Number> = <Number_Binary_String>"和"十六进制= &lt;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的子类。