• 解释器模式


    模式介绍

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

    模式优点

    1、可扩展性比较好,灵活。
    2、增加了新的解释表达式的方式,易于实现简单文法。

    模式缺点

    1、可利用场景比较少。
    2、对于复杂的文法比较难维护。
    3、解释器模式会引起类膨胀。
    4、解释器模式采用递归调用方法,效率低。

    使用场景

    1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。
    2、一些重复出现的问题可以用一种简单的语言来进行表达。
    3、一个简单语法需要解释的场景。

    系统建模

    1、创建一个接口Expression,它是所有终结符表达式和非终结符表达式的公共父类。
    2、定义作为上下文中主要解释器的TerminalExpression类,它实现了与文法中的终结符相关联的解释操作。
    3、通常在一个解释器模式中只有少数几个终结符表达式类。
    4、创建非终结符表达式OrExpression、AndExpression用于创建组合式表达式。
    5、非终结符表达式中可以包含终结符表达式,也可以继续包含非终结符表达式,因此其解释操作一般通过递归的方式来完成。

    系统实现

    /**
     * 解释器接口
     */
    public interface Expression {
       public boolean interpret(String context);
    }
    
    /**
     * TerminalExpression类
     */
    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类
     */
    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类
     */
    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);
       }
    }
    
    /**
     * 客户端
     */
    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"));
       }
    }
    结果:
    John is male? true
    Julie is a married women? true
    
  • 相关阅读:
    spark源码阅读之network(2)
    LoadRunner使用问题
    IDEA小技巧:添加代码快捷方式
    ByteUnit
    利用python列出当前目录下的所有文件
    python识别图片中的信息
    2019年3月2日-小雨.md
    2019年3月1日-日记
    2019年2月11日-日记
    2019年2月10日-日记
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/12242394.html
Copyright © 2020-2023  润新知