zoukankan      html  css  js  c++  java
  • 16解释器模式Interpreter

    一、什么是解释器模式

      Interpreter模式也叫解释器模式,是行为模式之一,它 是一种特殊的设计模式,它建立一个解释器,对于特定 的计算机程序设计语言,用来解释预先定义的文法。简 单地说,Interpreter模式是一种简单的语法解释器构架。

    二、解释器模式应用场景

      当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:

      该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间。

      效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的, 而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模式仍是有用的。

    三、解释器模式的结构

    三、解释器模式的角色和职责

      Context     解释器上下文环境类。用来存储解释器的上下文环境,比如需要解释的文法等。

      AbstractExpression     解释器抽象类。

      ConcreteExpression     解释器具体实现类。

    上下文

     1 /*
     2  * 上下文环境类,用来保存文法
     3  */
     4 public class Context {
     5     
     6     private String input;
     7     private int output;
     8     
     9     public Context(String input) {
    10         this.input = input;
    11     }
    12     
    13     public String getInput() {
    14         return input;
    15     }
    16     public void setInput(String input) {
    17         this.input = input;
    18     }
    19     public int getOutput() {
    20         return output;
    21     }
    22     public void setOutput(int output) {
    23         this.output = output;
    24     }
    25 }

    抽象解释器

    1 /*
    2  * 抽象解释器
    3  */
    4 public abstract class Expression {
    5     
    6     public abstract void interpret(Context context);//解释
    7 }

    减法表达式

     1 //减法表达式
     2 public class MinusExpression extends Expression {
     3 
     4     public void interpret(Context context) {
     5         System.out.println("自动递减");
     6         String input = context.getInput();
     7         int inInput = Integer.parseInt(input);
     8 //        inInput--;
     9         --inInput;
    10         context.setInput(String.valueOf(inInput));
    11         context.setOutput(inInput);
    12     }
    13 }

    加法表达式

     1 //加法表达式
     2 public class PlusExpression extends Expression {
     3 
     4     public void interpret(Context context) {
     5         //提示信息
     6         System.out.println("自动递增");
     7         //获得上下文环境
     8         String input = context.getInput();
     9         //进行类型转换
    10         int intInput = Integer.parseInt(input);
    11         //进行递增
    12 //        intInput++;
    13         ++intInput;
    14         //对上下文环境重新进行赋值
    15         context.setInput(String.valueOf(intInput));
    16         context.setOutput(intInput);
    17     }
    18 }

    测试

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 /*
     5  * client
     6  */
     7 public class MainClass {
     8     public static void main(String[] args) {
     9         String number = "20";
    10         Context context = new Context(number);
    11         
    12 //        Expression expression1 = new MinusExpression();
    13 //        expression1.interpret(context);
    14 //        System.out.println(context.getOutput());
    15 //        
    16 //        Expression expression2 = new PlusExpression();
    17 //        expression2.interpret(context);
    18 //        System.out.println(context.getOutput());
    19 //        
    20 //        Expression expression3 = new PlusExpression();
    21 //        expression3.interpret(context);
    22 //        System.out.println(context.getOutput());
    23 //        
    24 //        Expression expression4 = new PlusExpression();
    25 //        expression4.interpret(context);
    26 //        System.out.println(context.getOutput());
    27         
    28         List<Expression> list = new ArrayList<Expression>();
    29         list.add(new PlusExpression());
    30         list.add(new PlusExpression());
    31         list.add(new MinusExpression());
    32         list.add(new MinusExpression());
    33         list.add(new MinusExpression());
    34         list.add(new MinusExpression());
    35         
    36         for(Expression ex : list) {
    37             ex.interpret(context);
    38             System.out.println(context.getOutput());
    39         }
    40     }
    41 }
  • 相关阅读:
    Balanced Binary Tree
    Convert Sorted List to Binary Search Tree
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Validate Binary Search Tree
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Maximum Depth of Binary Tree
    如何把U盘的两个盘或者多个盘合成一个
    bugku 想蹭网先解开密码
  • 原文地址:https://www.cnblogs.com/justdoitba/p/9034347.html
Copyright © 2011-2022 走看看