博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模式23.解释器模式-Java
阅读量:4034 次
发布时间:2019-05-24

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

模式23.解释器模式

1.定义

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

  • 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
  • 考虑两个问题: 如何表示以及如何解释, eg:正则表达式

2.基础代码

在这里插入图片描述

类比:

在这里插入图片描述

(1)AbstractExpression

package designmode.interpreter;public abstract  class AbstractExpression {
public abstract void Interpret(Context context);}

(2) TerminalExpression

package designmode.interpreter;public class TerminalExpression extends AbstractExpression{
@Override public void Interpret(Context context) {
System.out.println("终端解释器"); }}

(3)NonterminalExpression

package designmode.interpreter;public class NonterminalExpression extends  AbstractExpression{
@Override public void Interpret(Context context) {
System.out.println("非终端解释器"); }}

(4)Client

package designmode.interpreter;import java.util.ArrayList;import java.util.List;public class Client {
public static void main(String[] args) {
Context context=new Context(); List
list=new ArrayList<>(); list.add(new TerminalExpression()); list.add(new NonterminalExpression()); list.add(new TerminalExpression()); list.add(new TerminalExpression()); for (AbstractExpression exp : list){
exp.Interpret(context); } }}
终端解释器非终端解释器终端解释器终端解释器Process finished with exit code 0

3.应用场景

当有一个语言需要解释执行,并且可以将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式

优点:

  • 使用解释器模式,意味着可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则。可以使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大题类似,这些类都易于直接编写。

缺点

  • 为文法中的每一条规则至少定义了一个类。因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译生成器来处理。

转载地址:http://bxfdi.baihongyu.com/

你可能感兴趣的文章
PaperDownloader 1.5.1——更加人性化的文献下载命名解决方案
查看>>
如何将PaperDownloader下载的文献存放到任意位置
查看>>
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
JVM最简生存指南
查看>>
漂亮的代码,糟糕的行为——解决Java运行时的内存问题
查看>>
Java的对象驻留
查看>>
logback高级特性使用(二) 自定义Pattern模板
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
可扩展、高可用服务网络设计方案
查看>>
如何构建高扩展性网站
查看>>
微服务架构的设计模式
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
STL::deque以及由其实现的queue和stack
查看>>
WAV文件解析
查看>>
DAC输出音乐2-解决pu pu 声
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>