Java设计模式--解释器模式(Interpreter)

概述


  • 定义:定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。
  • 解释器模式是一种类行为型模式。
  • 学习难度:★★★★★
  • 使用频率:★☆☆☆☆

优缺点


  • 优点
    • 提供了一个简单的方式来执行语法,而且容易修改或者扩展语法。
  • 缺点
    • 对于复杂文法难以维护。

类图


在这里插入图片描述

组成角色


  • 抽象解析器角色(AbstractExpression)
  • 终结符表达式(TerminalExpression)
  • 非终结符表达式(NonterminalExpression)
  • 环境角色(Context)

Code Example


抽象解析器角色(AbstractExpression)
/**
 * 抽象表达式角色:声明一个抽象的解释操作,这个接口为所有具体表达式角色(抽象语法树中的节点)都要实现的。
 * 
 * @author yanbin
 * 
 */
public interface Expression {

   /**
    * 抽象解释方法
    * 
    * @param ctx
    * @return
    */
   public Integer interpret(Context ctx);

}
终结符表达式(TerminalExpression)
/**
 * 终结符表达式角色:具体表达式。表示变量
 * 
 * @author yanbin
 * 
 */
public class Variable implements Expression {

   public Integer interpret(Context ctx) {
      // this 为调用interpret 方法的Variable 对象
      return ctx.get(this);
   }

}
/**
 * 终结符表达式角色:具体表达式。表示常量 <br>
 * a) 实现与文法中的终结符相关联的解释操作 <br>
 * b) 而且句子中的每个终结符需要该类的一个实例与之对应
 * 
 * @author yanbin
 * 
 */
public class Constant implements Expression {

   private Integer i;

   public Constant(Integer i) {
      this.i = i;
   }

   public Integer interpret(Context ctx) {
      return i;
   }

}
非终结符表达式(NonterminalExpression)
/**
 * 非终结符表达式角色:具体表达式。加
 * 
 * @author yanbin
 * 
 */
public class Add implements Expression {

   private Expression left, right;

   public Add(Expression left, Expression right) {
      this.left = left;
      this.right = right;
   }

   public Integer interpret(Context ctx) {
      return left.interpret(ctx) + right.interpret(ctx);
   }

}
/**
 * 非终结符表达式角色:具体表达式。减
 * 
 * @author yanbin
 * 
 */
class Subtract implements Expression {

   private Expression left, right;

   public Subtract(Expression left, Expression right) {
      this.left = left;
      this.right = right;
   }

   public Integer interpret(Context ctx) {
      return left.interpret(ctx) - right.interpret(ctx);
   }

}
/**
 * 非终结符表达式角色:具体表达式。乘
 * 
 * @author yanbin
 * 
 */
public class Multiply implements Expression {

   private Expression left, right;

   public Multiply(Expression left, Expression right) {
      this.left = left;
      this.right = right;
   }

   public Integer interpret(Context con) {
      return left.interpret(con) * right.interpret(con);
   }

}
/**
 * 非终结符表达式角色:具体表达式。 除
 * 
 * @author yanbin
 * 
 */
public class Division implements Expression {

   private Expression left, right;

   public Division(Expression left, Expression right) {
      this.left = left;
      this.right = right;
   }

   public Integer interpret(Context con) {
      try {
         return left.interpret(con) / right.interpret(con);
      } catch (ArithmeticException ae) {
         System.out.println("被除数为0!");
         return -11111;
      }
   }

}
环境角色(Context)
  • 表达式之外的所有内容,可有可无,可以有多种形式
/**
 * 上下文环境角色:包含解释器之外的一些全局信息。
 * 
 * @author yanbin
 * 
 */
public class Context {

   /** 存储变量 */
   private Map<Variable, Integer> valueMap = new HashMap<Variable, Integer>();

   public void addValue(Variable x, Integer y) {
      valueMap.put(x, y);
   }

   public Integer get(Variable x) {
      Integer i = valueMap.get(x);
      return i;
   }

}
客户端
/**
 * 解释器模式:定义语言的文法,并且建立一个解释器来解释该语言中的句子。它属于类的行为模式。
 * 组成:抽象表达式角色;终结符表达式角色;非终结符表达式角色;上下文环境角色;客户角色。
 * 优点:解释器模式提供了一个简单的方式来执行语法,而且容易修改或者扩展语法。<br>
 * 缺点:解释器模式对于复杂文法难以维护。
 * 
 * @author yanbin
 * 
 */
public class InterpreterPattern {

   public static void main(String[] args) {
      Context ctx = new Context();
      // 设置变量、常量
      Variable a = new Variable();
      Variable b = new Variable();
      Constant c = new Constant(2);
      // 为变量赋值
      ctx.addValue(a, 6);
      ctx.addValue(b, 7);
      // 运算,对句子的结构由我们自己来分析,构造
      Expression exp = new Division(new Multiply(a, b), new Add(new Subtract(a, b), c));
      System.out.println("运算结果为:" + exp.interpret(ctx));
   }

}

猜你喜欢

转载自blog.csdn.net/yanbin0830/article/details/89081765