Design Pattern 简明教程

Design Patterns - Interpreter Pattern

解释器模式提供了一种评估语言语法或表达式的途径。这类模式属于行为型模式。本模式需要实现一个表达式接口,描述一个特定上下文的解析方式。本模式常用于 SQL 解析、符号处理引擎等场景。

Interpreter pattern provides a way to evaluate language grammar or expression. This type of pattern comes under behavioral pattern. This pattern involves implementing an expression interface which tells to interpret a particular context. This pattern is used in SQL parsing, symbol processing engine etc.

Implementation

我们将创建一个表达式接口和实现该表达接口的具体类。类 TerminalExpression 被定义为问题的上下文的主解释器。其他类 OrExpression、AndExpression 用于创建组合表达式。

We are going to create an interface Expression and concrete classes implementing the Expression interface. A class TerminalExpression is defined which acts as a main interpreter of context in question. Other classes OrExpression, AndExpression are used to create combinational expressions.

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

InterpreterPatternDemo, our demo class, will use Expression class to create rules and demonstrate parsing of expressions.

interpreter pattern uml diagram

Step 1

创建一个表达式接口。

Create an expression interface.

Expression.java

public interface Expression {
   public boolean interpret(String context);
}

Step 2

创建实现上述接口的具体类。

Create concrete classes implementing the above interface.

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);
   }
}

Step 3

InterpreterPatternDemo 使用 Expression 类来创建规则并解释它们。

InterpreterPatternDemo uses Expression class to create rules and then parse them.

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"));
   }
}

Step 4

验证输出。

Verify the output.

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