美文网首页
设计模式第1篇:解释器模式

设计模式第1篇:解释器模式

作者: 大厂offer | 来源:发表于2017-12-11 10:51 被阅读4次

本文翻译自: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模型)

image.png

Important Points about Interpreter pattern

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

相关文章

网友评论

      本文标题:设计模式第1篇:解释器模式

      本文链接:https://www.haomeiwen.com/subject/khzbixtx.html