博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
16解释器模式Interpreter
阅读量:6225 次
发布时间:2019-06-21

本文共 3545 字,大约阅读时间需要 11 分钟。

一、什么是解释器模式

  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
list = new ArrayList
();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 }

 

转载于:https://www.cnblogs.com/justdoitba/p/9034347.html

你可能感兴趣的文章
sql语句查询某表里是否存在重复数据
查看>>
linux shell
查看>>
数据库连接及操作实例
查看>>
【Java】jdk8 Optional 的正确姿势
查看>>
云栖科技评论第56期:莫忧AI泡沫 相信AI兴邦
查看>>
超级有用的15个mysqlbinlog命令
查看>>
数据库之间转移数据
查看>>
PHP连接Mysql常用API(mysql,mysqli,pdo)区别与联系
查看>>
java中的CAS
查看>>
简单的markdown在线解析服务
查看>>
Linux基础(day44)
查看>>
Git 分支创建及使用
查看>>
MariaDB安装, Apache安装
查看>>
多线程三分钟就可以入个门了!
查看>>
从道法术三个层面理解区块链:术
查看>>
elasticsearch入门使用
查看>>
数据结构与算法4
查看>>
tomcat去掉项目名称
查看>>
微服务架构的优势与不足(一)
查看>>
分布式服务治理框架Dubbo
查看>>