设计模式 解释器模式

  • 设计模式 - 解释器模式

    解释器模式提供了一种计算语言语法或表达的方式。这种模式属于行为模式。这种模式涉及实现一个表达式接口,该接口告诉您解释特定的上下文。此模式用于SQL解析,符号处理引擎等。
  • 实例

    我们将创建一个Expression接口,并实现Expression接口的具体类。定义了一个TerminalExpression类,该类充当有关上下文的主要解释器。其他类OrExpression,AndExpression用于创建组合表达式。
    我们的演示类InterpreterPatternDemo将使用Expression类创建规则并演示表达式的解析。
    dp
    第1步 - 创建一个表达式接口。 Expression.java
    
    public interface Expression {
       public boolean interpret(String context);
    }
    
    第2步 - 创建实现上述接口的具体类。 TerminalExpression.java , OrExpression.java, AndExpression.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;
       }
    }
    
    
    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);
       }
    }
    
    
    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);
       }
    }
    
    第3步 - InterpreterPatternDemo使用Expression类创建规则,然后解析它们。 InterpreterPatternDemo.java
    
    public class InterpreterPatternDemo {
    
       //Rule: Robert and John are male
       public static Expression getMaleExpression(){
          Expression robert = new TerminalExpression("Robert");
          Expression john = new TerminalExpression("John");
          return new OrExpression(robert, john);            
       }
    
       //Rule: Julie is a married women
       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"));
       }
    }
    
    步骤4 - 验证输出。
    
    John is male? true
    Julie is a married women? true