Java设计模式--解释器模式
解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
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设计模式--解释器模式相关推荐
- Java设计模式-解释器模式
解释器模式 在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性.如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,这样就可以用"编译原理" ...
- 设计模式 | 解释器模式及典型应用
微信原文:设计模式 | 解释器模式及典型应用 博客原文:设计模式 | 解释器模式及典型应用 本文主要介绍解释器模式,在日常开发中,解释器模式的使用频率比较低 解释器模式 解释器模式(Interpret ...
- Python设计模式-解释器模式
Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...
- Java 设计模式——状态模式
概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...
- Java设计模式——Builder模式
前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...
- Java设计模式-工厂模式(3)抽象工厂模式
在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...
- Java设计模式-工厂模式(2)工厂方法模式
在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...
- Java设计模式-工厂模式(1)简单工厂模式
Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...
- java设计模式代理模式_Java中的代理设计模式
java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...
最新文章
- 切版网上线,启用qieban.cn
- 广度优先搜索(BreadthFirstSearch) 迪克斯特拉算法 (Dijkstra's algorithm)
- nginx配置文件中,location字段里面的root字段和别名alias
- Java核心编程总结(五、线程池与死锁),淘汰了80%的Java面试者
- jQuery学习笔记(二)
- java设计模式-State模式
- 输入法分类总结与优缺点
- 物联网定位技术超全解析
- android--关于apk加密那点事的思考
- C#使用VS2019打包安装程序(图标修改和默认安装路径修改)
- 9针串口RS232、RS485之间的差异
- 手写文本 matlab 识别,手写汉字识别matlab
- 基于多传感器数据融合的全自动泊车系统研究与应用(开题报告)
- 西方世界的劫难Ⅳ:真神的国度--十大支线攻略
- Auto MDI/MDI-X 简要说明及网线头线序
- docker 创建容器时指定容器ip
- 古罗马数字的基本知识
- 【嵌入式12】DMA通信原理及编程实验,DMA方式向上位机连续发送数据
- java文档注释定界符_c语言的注释定界符详解
- 无法访问指定计算机,电脑打开磁盘/程序/文件时提示Windows无法访问指定设备、路径或文件怎么办...
热门文章
- HTML网站即将上线临时托管源码
- vscode 结束_21 个VSCode 快捷键,让代码更快,更有趣
- mysql升级后乱码_Mysql转换或者升级以后出现乱码情况的说明
- android缓存的后台进程,Android应用程序进程生命周期详解
- 夏日清凉小风扇网站源码 抖音引流神器
- 小程序功能模块-在线考试2.10.3源码
- Bootstrap 3: 菜单居中 Center content in responsive bootstrap navbar
- Bootstrap 3: 图标转换事件 Change icons when toggle
- 推荐轻量级MySQL数据库管理工具 Adminer
- 通过GeoIP获取ip所属地 (国家,城市,时区,邮编,经纬度等)