橘子味的心
标题:Java解释器模式

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

实现示例

我们将创建一个接口Expression并且在具体的类实现这个Expression接口。 定义了一个TerminalExpression类,用作所讨论的上下文的主解释器。 其他的类 - OrExpressionAndExpression用于创建组合表达式。

InterpreterPatternDemo这是一个演示类,将使用Expression类来创建规则并演示表达式的解析。

实现解释器模式的结构如下图所示 -

第1步

创建表达式接口 -
Expression.java

  1. public interface Expression {
  2. public boolean interpret(String context);
  3. }
  4. Java

第2步

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

  1. public class TerminalExpression implements Expression {
  2.  
  3. private String data;
  4.  
  5. public TerminalExpression(String data){
  6. this.data = data;
  7. }
  8.  
  9. @Override
  10. public boolean interpret(String context) {
  11.  
  12. if(context.contains(data)){
  13. return true;
  14. }
  15. return false;
  16. }
  17. }
  18. Java

OrExpression.java

  1. public class OrExpression implements Expression {
  2.  
  3. private Expression expr1 = null;
  4. private Expression expr2 = null;
  5.  
  6. public OrExpression(Expression expr1, Expression expr2) {
  7. this.expr1 = expr1;
  8. this.expr2 = expr2;
  9. }
  10.  
  11. @Override
  12. public boolean interpret(String context) {
  13. return expr1.interpret(context) || expr2.interpret(context);
  14. }
  15. }
  16. Java

AndExpression.java

  1. public class AndExpression implements Expression {
  2.  
  3. private Expression expr1 = null;
  4. private Expression expr2 = null;
  5.  
  6. public AndExpression(Expression expr1, Expression expr2) {
  7. this.expr1 = expr1;
  8. this.expr2 = expr2;
  9. }
  10.  
  11. @Override
  12. public boolean interpret(String context) {
  13. return expr1.interpret(context) && expr2.interpret(context);
  14. }
  15. }
  16. Java

第3步

reterPatternDemo使用Expression类来创建规则,然后解析它们。

InterpreterPatternDemo.java

  1. public class InterpreterPatternDemo {
  2.  
  3. //Rule: Robert and John are male
  4. public static Expression getMaleExpression(){
  5. Expression robert = new TerminalExpression("Robert");
  6. Expression john = new TerminalExpression("John");
  7. return new OrExpression(robert, john);
  8. }
  9.  
  10. //Rule: Julie is a married women
  11. public static Expression getMarriedWomanExpression(){
  12. Expression julie = new TerminalExpression("Julie");
  13. Expression married = new TerminalExpression("Married");
  14. return new AndExpression(julie, married);
  15. }
  16.  
  17. public static void main(String[] args) {
  18. Expression isMale = getMaleExpression();
  19. Expression isMarriedWoman = getMarriedWomanExpression();
  20.  
  21. System.out.println("John is male? " + isMale.interpret("John"));
  22. System.out.println("Julie is a married women? " + isMarriedWoman.interpret("Married Julie"));
  23. }
  24. }
  25. Java

第4步

验证输出 -

  1. John is male? true
  2. Julie is a married women? true
  3. Java