Java设计模式(十九):解释器设计模式
1. 应用场景
给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。(如:360读取lua脚本,这个细节的实现就是解释器模式)
2.概念
为语言创建解释器,通常由语言的语法和语法分析来定义。
3. Class Diagram
- TerminalExpression:终结符表达式,每个终结符都需要一个 TerminalExpression。
- NoTerminalExpression:没有终结符表达式
- Context:上下文,包含解释器之外的一些全局信息。
4. Implementation
以下是一个规则检验器实现,具有 and 和 or 规则,通过规则可以构建一颗解析树,用来检验一个文本是否满足解析树定义的规则。
例如一颗解析树为 D And (A Or (B C)),文本 “D A” 满足该解析树定义的规则。
这里的 Context 指的是 String。
public abstract class Expression {public abstract boolean interpret(String str);
}
public class TerminalExpression extends Expression {private String literal = null;public TerminalExpression(String str) {literal = str;}public boolean interpret(String str) {StringTokenizer st = new StringTokenizer(str);while (st.hasMoreTokens()) {String test = st.nextToken();if (test.equals(literal)) {return true;}}return false;}
}
public class AndExpression extends Expression {private Expression expression1 = null;private Expression expression2 = null;public AndExpression(Expression expression1, Expression expression2) {this.expression1 = expression1;this.expression2 = expression2;}public boolean interpret(String str) {return expression1.interpret(str) && expression2.interpret(str);}
}
public class OrExpression extends Expression {private Expression expression1 = null;private Expression expression2 = null;public OrExpression(Expression expression1, Expression expression2) {this.expression1 = expression1;this.expression2 = expression2;}public boolean interpret(String str) {return expression1.interpret(str) || expression2.interpret(str);}
}
public class Client {/*** 构建解析树*/public static Expression buildInterpreterTree() {// LiteralExpression terminal1 = new TerminalExpression("A");Expression terminal2 = new TerminalExpression("B");Expression terminal3 = new TerminalExpression("C");Expression terminal4 = new TerminalExpression("D");// B CExpression alternation1 = new OrExpression(terminal2, terminal3);// A Or (B C)Expression alternation2 = new OrExpression(terminal1, alternation1);// D And (A Or (B C))return new AndExpression(terminal4, alternation2);}public static void main(String[] args) {Expression define = buildInterpreterTree();String context1 = "D A";String context2 = "A B";System.out.println(define.interpret(context1));System.out.println(define.interpret(context2));}
}运行结果:
true
false
5. 优点和缺点
5.1 优点
- 将每一个语法规则表示成一个类,方便实现语言。
- 因为语法由许多类表示,所有你可以轻易的改变或者扩展此语言
- 通过在类结构中加入新的方法,可以在解释的同时增加新的行为,列如打印格式化的美化。
5.2 用途和缺点
- 当你需要实现一个简单的语言时,使用解释器。
- 当你有一个简单的语法,而且简单比效率更重要的时候,使用解释器。
- 可以处理脚本语言和编程语言
- 当语法规则的数目太大的时候,这个模式可能会变得非常繁杂。在这种情况下,使用解释器/编译器的产生器可能更加合适。
6. JDK
- java.util.Pattern
- java.text.Normalizer
- All subclasses of java.text.Format
- javax.el.ELResolver
Java设计模式(十九):解释器设计模式相关推荐
- java第十九次学习笔记
java第十九次学习笔记 异常 java第十九次学习笔记 前言 一.try catch 二.多个异常如何处理 前言 斯人若彩虹遇上方知有 一.try catch package Demo01;impo ...
- java设计模式适配器模式_Java解释器设计模式
java设计模式适配器模式 Interpreter design pattern is one of the behavioral design pattern. Interpreter patter ...
- Java进阶篇设计模式之九----- 解释器模式和迭代器模式
前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...
- Java设计模式(十):迭代器设计模式
1.应用场景 (1)访问一个聚合对象的内容而无需暴露它的内部表示 (2)支持对聚合对象的多种遍历 (3)为遍历不同的聚合结构提供一个统一的接口 2.概念 提供一种顺序访问聚合对象元素的方法,并且不暴露 ...
- php 命令设计模式示例,php设计模式(十九)命令模式-Fun言
命令模式就和名字一样: 比较适合执行命令的场景: 命令发送者只管调用具体命令类中的 execute() 方法: 然后在具体命令类中设定命令接收者: 可以消除命令发送者和命令接受者之间的耦合: 并且可以 ...
- 菜鸟学Java(十九)——WEB项目测试好帮手,Maven+Jetty
做WEB开发,测试是一件很费时间的事情.所以我们就应该用更简单.更快捷的方式进行测试.今天就向大家介绍一个轻量级的容器--jetty.今天说的etty是Maven的一个插件jetty-maven-pl ...
- Java进阶(十九)利用正则表达式批处理含链接内容文档
利用正则表达式批处理含链接内容文档 由于项目需求,自己需要将带有链接的标签去除,例如 <a href="/zhaoyao/17-66.html">头晕</a> ...
- Java实现二十三种设计模式(五)—— 十一种行为型模式 (中)——解释器模式、迭代器模式、中介者模式、备忘录模式
Java实现二十三种设计模式(五)-- 十一种行为型模式 (中)--解释器模式.迭代器模式.中介者模式.备忘录模式 一.解释器模式 我国 IT 界历来有一个汉语编程梦,虽然各方对于汉语编程争论不休,甚 ...
- (原创)无废话C#设计模式之十九:Observer
无废话C#设计模式之十九:Observer 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 场景 这次不说游戏了,假设我们需要在一个W ...
最新文章
- yum源简单介绍及本地yum源的搭建
- java.lang.IllegalAccessError: org.apache.commons.dbcp.DelegatingPreparedStatement.isClosed()Z
- 【杂谈】关于批量采购与教材试点深度学习之图像识别,模型设计,人脸图像处理书籍相关问题...
- 如何安装Windows10+CentOS7双系统_自用成功版——注意看评论的注意事项
- CVPR 2019 | 旷视研究院提出新型损失函数:改善边界框模糊问题
- [POI2007]POW-The Flood
- 《为iPad而设计:打造畅销App》——将iPad作为视频娱乐设备
- CentOS 7 Hadoop安装配置
- 浅谈IEEE会议论文的不出席政策Non-Presented Paper(No-Show)Policy
- 路由器装linux系统,怎样在路由器上安装Linux / DD-WRT固件
- scam计算机术语是什么意思,外贸术语dropshipping 是什么意思?如何操作?
- 湿化学清洗过程中晶片污染控制方法
- 《AMNet: Deep Atrous Multiscale Stereo Disparity Estimation Networks》
- 申请美国商务签证(B1/B2) -- 大连
- 最新款带采集功能壁纸/头像/动态壁纸小程序上线超炫裂变超强支持投稿
- 小米平板2 win10 MIUI互刷教程
- 矩阵论极简笔记(2):列空间、正交补、零空间、行空间
- EXCEL的几个取整函数对比,int() round() ceiling() ceiling.math()等
- Ubuntu 键盘鼠标失效解决办法
- 为什么大部分公司的数据库系统仍然要使用oracle?