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设计模式(十九):解释器设计模式相关推荐

  1. java第十九次学习笔记

    java第十九次学习笔记 异常 java第十九次学习笔记 前言 一.try catch 二.多个异常如何处理 前言 斯人若彩虹遇上方知有 一.try catch package Demo01;impo ...

  2. java设计模式适配器模式_Java解释器设计模式

    java设计模式适配器模式 Interpreter design pattern is one of the behavioral design pattern. Interpreter patter ...

  3. Java进阶篇设计模式之九----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

  4. Java设计模式(十):迭代器设计模式

    1.应用场景 (1)访问一个聚合对象的内容而无需暴露它的内部表示 (2)支持对聚合对象的多种遍历 (3)为遍历不同的聚合结构提供一个统一的接口 2.概念 提供一种顺序访问聚合对象元素的方法,并且不暴露 ...

  5. php 命令设计模式示例,php设计模式(十九)命令模式-Fun言

    命令模式就和名字一样: 比较适合执行命令的场景: 命令发送者只管调用具体命令类中的 execute() 方法: 然后在具体命令类中设定命令接收者: 可以消除命令发送者和命令接受者之间的耦合: 并且可以 ...

  6. 菜鸟学Java(十九)——WEB项目测试好帮手,Maven+Jetty

    做WEB开发,测试是一件很费时间的事情.所以我们就应该用更简单.更快捷的方式进行测试.今天就向大家介绍一个轻量级的容器--jetty.今天说的etty是Maven的一个插件jetty-maven-pl ...

  7. Java进阶(十九)利用正则表达式批处理含链接内容文档

    利用正则表达式批处理含链接内容文档 由于项目需求,自己需要将带有链接的标签去除,例如 <a href="/zhaoyao/17-66.html">头晕</a> ...

  8. Java实现二十三种设计模式(五)—— 十一种行为型模式 (中)——解释器模式、迭代器模式、中介者模式、备忘录模式

    Java实现二十三种设计模式(五)-- 十一种行为型模式 (中)--解释器模式.迭代器模式.中介者模式.备忘录模式 一.解释器模式 我国 IT 界历来有一个汉语编程梦,虽然各方对于汉语编程争论不休,甚 ...

  9. (原创)无废话C#设计模式之十九:Observer

    无废话C#设计模式之十九:Observer 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 场景 这次不说游戏了,假设我们需要在一个W ...

最新文章

  1. yum源简单介绍及本地yum源的搭建
  2. java.lang.IllegalAccessError: org.apache.commons.dbcp.DelegatingPreparedStatement.isClosed()Z
  3. 【杂谈】关于批量采购与教材试点深度学习之图像识别,模型设计,人脸图像处理书籍相关问题...
  4. 如何安装Windows10+CentOS7双系统_自用成功版——注意看评论的注意事项
  5. CVPR 2019 | 旷视研究院提出新型损失函数:改善边界框模糊问题
  6. [POI2007]POW-The Flood
  7. 《为iPad而设计:打造畅销App》——将iPad作为视频娱乐设备
  8. CentOS 7 Hadoop安装配置
  9. 浅谈IEEE会议论文的不出席政策Non-Presented Paper(No-Show)Policy
  10. 路由器装linux系统,怎样在路由器上安装Linux / DD-WRT固件
  11. scam计算机术语是什么意思,外贸术语dropshipping 是什么意思?如何操作?
  12. 湿化学清洗过程中晶片污染控制方法
  13. 《AMNet: Deep Atrous Multiscale Stereo Disparity Estimation Networks》
  14. 申请美国商务签证(B1/B2) -- 大连
  15. 最新款带采集功能壁纸/头像/动态壁纸小程序上线超炫裂变超强支持投稿
  16. 小米平板2 win10 MIUI互刷教程
  17. 矩阵论极简笔记(2):列空间、正交补、零空间、行空间
  18. EXCEL的几个取整函数对比,int() round() ceiling() ceiling.math()等
  19. Ubuntu 键盘鼠标失效解决办法
  20. 为什么大部分公司的数据库系统仍然要使用oracle?

热门文章

  1. React Native初始化项目0.47.1报错
  2. GlusterFS常用命令小结
  3. C++静态库与动态库(简介)
  4. songsoft-关于加薪的策略
  5. 转:小城也有好去处(3):云南建水 - 丽江大理之后第三城
  6. Erlang China 大会 - CN Erlounge III - 发起
  7. C语言程序设计之编程求鸡和兔的只数,用穷举法解决
  8. Python将是人工智能时代的最佳编程语言
  9. 利用VSPD、串口调试助手、Keil做串口调试
  10. 单播、多播和广播详解