掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

设计模式之解释器模式详解(定义、优缺点、应用场景、实例类图)

解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。这种模式被用在 SQL 解析、符号处理引擎等。

一、解释器模式的介绍

意图

定义一种语言的文法表示,并创建一个解释器,该解释器能够解释该语言中的句子。。

主要解决的问题

解释器模式用于构建一个能够解释特定语言或文法的句子的解释器。

使用场景

当某一特定类型的问题频繁出现,并且可以通过一种简单的语言来表达这些问题的实例时。

实现方式

  1. 定义文法:明确语言的终结符和非终结符。

  2. 构建语法树:根据语言的句子构建对应的语法树结构。

  3. 创建环境类:包含解释过程中所需的全局信息,通常是一个HashMap。

关键代码

  1. 终结符与非终结符:定义语言的文法结构。

  2. 环境类:存储解释过程中需要的外部环境信息。

结构

解释器模式包含以下几个主要角色:

  1. 抽象表达式(Abstract Expression):定义了解释器的抽象接口,声明了解释操作的方法,通常是一个抽象类或接口。

  2. 终结符表达式(Terminal Expression):实现了抽象表达式接口的终结符表达式类,用于表示语言中的终结符(如变量、常量等),并实现了对应的解释操作。

  3. 非终结符表达式(Non-terminal Expression):实现了抽象表达式接口的非终结符表达式类,用于表示语言中的非终结符(如句子、表达式等),并实现了对应的解释操作。

  4. 上下文(Context):包含解释器之外的一些全局信息,在解释过程中提供给解释器使用,通常用于存储变量的值、保存解释器的状态等。

  5. 客户端(Client):创建并配置具体的解释器对象,并将需要解释的表达式传递给解释器进行解释。

应用实例

  1. 编译器:解释器模式可以用于编译器设计,将源代码解释为目标代码。

  2. 正则表达式:解释器模式可以用于解析和执行正则表达式。

  3. SQL解析:解释器模式可以用于解析和执行SQL语句。

二、解释器模式的优缺点

优点

  1. 可扩展性好:容易添加新的解释表达式的方式。

  2. 灵活性:可以根据需要轻松扩展或修改文法。

  3. 易于实现简单文法:对于简单的语言,实现起来相对容易。

缺点

  1. 使用场景有限:只适用于适合使用解释的简单文法。

  2. 维护困难:对于复杂的文法,维护和扩展变得困难。

  3. 类膨胀:可能会产生很多类,每个文法规则对应一个类。

  4. 递归调用:解释器模式通常使用递归调用,这可能难以理解和跟踪。

三、解释器模式的使用建议

  1. 在需要解释执行语言中的句子时,考虑使用解释器模式。

  2. 确保文法简单,以避免系统变得过于复杂。

  3. 解释器模式在 Java 中可能不是首选,如果遇到适用场景,可以考虑使用如expression4J之类的库来代替。

四、解释器模式的实现

我们将创建一个接口 Expression 和实现了 Expression 接口的实体类。定义作为上下文中主要解释器的 TerminalExpression 类。其他的类 OrExpression、AndExpression 用于创建组合式表达式。

InterpreterPatternDemo,我们的演示类使用 Expression 类创建规则和演示表达式的解析。

解释器模式

  1. 步骤 1:创建一个表达式接口。

Expression.java

public interface Expression {
   public boolean interpret(String context);
}
  1. 步骤 2:创建实现了上述接口的实体类。

TerminalExpression.java

public class TerminalExpression implements Expression {
   
   private String data;
 
   public TerminalExpression(String data){
      this.data = data; 
   }
 
   @Override
   public boolean interpret(String context) {
      if(context.contains(data)){
         return true;
      }
      return false;
   }
}

OrExpression.java

public class OrExpression implements Expression {
    
   private Expression expr1 = null;
   private Expression expr2 = null;
 
   public OrExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }
 
   @Override
   public boolean interpret(String context) {      
      return expr1.interpret(context) || expr2.interpret(context);
   }
}

AndExpression.java

public class AndExpression implements Expression {
    
   private Expression expr1 = null;
   private Expression expr2 = null;
 
   public AndExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }
 
   @Override
   public boolean interpret(String context) {      
      return expr1.interpret(context) && expr2.interpret(context);
   }
}
  1. 步骤 3:InterpreterPatternDemo 使用 Expression 类来创建规则,并解析它们。

InterpreterPatternDemo.java

public class InterpreterPatternDemo {
 
   //规则:Robert 和 John 是男性
   public static Expression getMaleExpression(){
      Expression robert = new TerminalExpression("Robert");
      Expression john = new TerminalExpression("John");
      return new OrExpression(robert, john);    
   }
 
   //规则:Julie 是一个已婚的女性
   public static Expression getMarriedWomanExpression(){
      Expression julie = new TerminalExpression("Julie");
      Expression married = new TerminalExpression("Married");
      return new AndExpression(julie, married);    
   }
 
   public static void main(String[] args) {
      Expression isMale = getMaleExpression();
      Expression isMarriedWoman = getMarriedWomanExpression();
 
      System.out.println("John is male? " + isMale.interpret("John"));
      System.out.println("Julie is a married women? " 
      + isMarriedWoman.interpret("Married Julie"));
   }
}
  1. 步骤 4:执行程序,输出结果:

John is male? true
Julie is a married women? true

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • 购物小票识别

    支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景

    支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景

  • 涉农贷款地址识别

    涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。

    涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。

  • 人脸四要素

    根据给定的手机号、姓名、身份证、人像图片核验是否一致

    根据给定的手机号、姓名、身份证、人像图片核验是否一致

  • 个人/企业涉诉查询

    通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

    通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

  • IP反查域名

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

0512-88869195
数 据 驱 动 未 来
Data Drives The Future