解释器模式

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

Interpreter Pattern

Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.

类图

模式的结构与使用

解释器模式的结构中包括四个角色。
+ 抽象表达式(AbstractExpression):该角色为一个接口,负责定义抽象的解释操作。
+ 终结符表达式(TerminalExpression):实现AbstractExpression接口的类。该类将接口中的解释器操作实现为与文法中的终结符相关联的操作,即文法中的每个终结符需要一个TerminalExpression类。
+ 非终结符表达式(NonterminalExpression):实现AbstractExpression接口的类。文法中的每一条规则R::=R1R2…Rn都需要一个NonterminalExpression类。NonterminalExpression类为文法中的非终结符号实现解释操作,该解释操作通常使用递归用表示Ri到Rn的那些对象的解释操作。
+ 上下文(Context):包含解释器之外的一些全局信息。

简单的例子

Node的接口类Dog.java

package Interpreter;public interface Node {public void parse(Context text);public void execute();
}

Context的类Context.java

package Interpreter;import java.util.StringTokenizer;public class Context {StringTokenizer tokenizer;String token;public Context(String text) {setContext(text);}public void setContext(String text) {tokenizer = new StringTokenizer(text);}String nextToken() {if (tokenizer.hasMoreTokens()) {token = tokenizer.nextToken();} else token = "";return token;}
}

Node的实现类SubjectPronounOrNounNode.java

package Interpreter;public class SubjectPronounOrNounNode implements Node {String[] word = {"You", "He", "Teacher", "Student"};String token;boolean boo;@Overridepublic void parse(Context context) {token = context.nextToken();int i = 0;for (; i < word.length; i++) {if (token.equalsIgnoreCase(word[i])) {boo = true;break;}}if (i == word.length) {boo = false;}}@Overridepublic void execute() {if (boo) {if (token.equalsIgnoreCase(word[0]))System.out.print("你");if (token.equalsIgnoreCase(word[1]))System.out.print("他");if (token.equalsIgnoreCase(word[2]))System.out.print("老师");if (token.equalsIgnoreCase(word[3]))System.out.print("学生");} else {System.out.println(token + "(不是该语言中的语句)");}}
}

Node的实现类ObjectPronounOrNounNode.java

package Interpreter;public class ObjectPronounOrNounNode implements Node {String[] word = {"Me", "Him", "Tiger", "Apple"};String token;boolean boo;@Overridepublic void parse(Context context) {token = context.nextToken();int i = 0;for (; i < word.length; i++) {if (token.equalsIgnoreCase(word[i])) {boo = true;break;}}if (i == word.length) {boo = false;}}@Overridepublic void execute() {if (boo) {if (token.equalsIgnoreCase(word[0]))System.out.print("我");if (token.equalsIgnoreCase(word[1]))System.out.print("他");if (token.equalsIgnoreCase(word[2]))System.out.print("老虎");if (token.equalsIgnoreCase(word[3]))System.out.print("苹果");} else {System.out.println(token + "(不是该语言中的语句)");}}
}

Node的实现类VerbNode.java

package Interpreter;public class VerbNode implements Node {String[] word = {"Drink", "Eat", "Look", "beat"};String token;boolean boo;@Overridepublic void parse(Context context) {token = context.nextToken();int i = 0;for (; i < word.length; i++) {if (token.equalsIgnoreCase(word[i])) {boo = true;break;}}if (i == word.length) {boo = false;}}@Overridepublic void execute() {if (boo) {if (token.equalsIgnoreCase(word[0]))System.out.print("喝");if (token.equalsIgnoreCase(word[1]))System.out.print("吃");if (token.equalsIgnoreCase(word[2]))System.out.print("看");if (token.equalsIgnoreCase(word[3]))System.out.print("打");} else {System.out.println(token + "(不是该语言中的语句)");}}
}

Node的实现类SubjectNode.java

package Interpreter;public class SubjectNode implements Node {Node node;@Overridepublic void parse(Context text) {node = new SubjectPronounOrNounNode();node.parse(text);}@Overridepublic void execute() {node.execute();}
}

Node的实现类PredicateNode.java

papackage Interpreter;public class PredicateNode implements Node {Node verbNode, objectNode;@Overridepublic void parse(Context text) {verbNode = new VerbNode();objectNode = new ObjectPronounOrNounNode();verbNode.parse(text);objectNode.parse(text);}@Overridepublic void execute() {verbNode.execute();objectNode.execute();}
}

Node的实现类SentenceNode.java

package Interpreter;public class SentenceNode implements Node {Node subjectNode, predicateNode;@Overridepublic void parse(Context text) {subjectNode = new SubjectNode();predicateNode = new PredicateNode();subjectNode.parse(text);predicateNode.parse(text);}@Overridepublic void execute() {subjectNode.execute();predicateNode.execute();}
}

测试类Application.java

package Interpreter;public class Application {public static void main(String[] args) {String text = "Teacher beat tiger";Context context = new Context(text);Node node = new SentenceNode();node.parse(context);node.execute();System.out.println();text = "You eat apple";context.setContext(text);node.parse(context);node.execute();}
}

运行结果

老师打老虎
你吃苹果

解释器模式的优点

  • 将每一个语法规则表示成一个类,方便于实现简单的语言。
  • 由于使用类表示语法规则,可以较容易改变或扩展语言的行为。
  • 通过在类结构中加入新的方法,可以在解释的同时增加新的行为。

适用解释器模式的情景

  • 当有一个简单的语言需要解释执行,并且可以将该语言的每一个规则表示为一个类时,就可以使用解释模式。

注意:如果文法过于复杂,那么过多的文法规则使我们很艰难维护所给出的类。

下载源码请到

MyGitHub

Java设计模式--解释器模式相关推荐

  1. Java设计模式-解释器模式

    解释器模式   在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性.如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,这样就可以用"编译原理" ...

  2. 设计模式 | 解释器模式及典型应用

    微信原文:设计模式 | 解释器模式及典型应用 博客原文:设计模式 | 解释器模式及典型应用 本文主要介绍解释器模式,在日常开发中,解释器模式的使用频率比较低 解释器模式 解释器模式(Interpret ...

  3. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

  4. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  5. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

  6. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  7. Java设计模式-工厂模式(2)工厂方法模式

    在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...

  8. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  9. java设计模式代理模式_Java中的代理设计模式

    java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...

最新文章

  1. 切版网上线,启用qieban.cn
  2. 广度优先搜索(BreadthFirstSearch) 迪克斯特拉算法 (Dijkstra's algorithm)
  3. nginx配置文件中,location字段里面的root字段和别名alias
  4. Java核心编程总结(五、线程池与死锁),淘汰了80%的Java面试者
  5. jQuery学习笔记(二)
  6. java设计模式-State模式
  7. 输入法分类总结与优缺点
  8. 物联网定位技术超全解析
  9. android--关于apk加密那点事的思考
  10. C#使用VS2019打包安装程序(图标修改和默认安装路径修改)
  11. 9针串口RS232、RS485之间的差异
  12. 手写文本 matlab 识别,手写汉字识别matlab
  13. 基于多传感器数据融合的全自动泊车系统研究与应用(开题报告)
  14. 西方世界的劫难Ⅳ:真神的国度--十大支线攻略
  15. Auto MDI/MDI-X 简要说明及网线头线序
  16. docker 创建容器时指定容器ip
  17. 古罗马数字的基本知识
  18. 【嵌入式12】DMA通信原理及编程实验,DMA方式向上位机连续发送数据
  19. java文档注释定界符_c语言的注释定界符详解
  20. 无法访问指定计算机,电脑打开磁盘/程序/文件时提示Windows无法访问指定设备、路径或文件怎么办...

热门文章

  1. HTML网站即将上线临时托管源码
  2. vscode 结束_21 个VSCode 快捷键,让代码更快,更有趣
  3. mysql升级后乱码_Mysql转换或者升级以后出现乱码情况的说明
  4. android缓存的后台进程,Android应用程序进程生命周期详解
  5. 夏日清凉小风扇网站源码 抖音引流神器
  6. 小程序功能模块-在线考试2.10.3源码
  7. Bootstrap 3: 菜单居中 Center content in responsive bootstrap navbar
  8. Bootstrap 3: 图标转换事件 Change icons when toggle
  9. 推荐轻量级MySQL数据库管理工具 Adminer
  10. 通过GeoIP获取ip所属地 (国家,城市,时区,邮编,经纬度等)