1、模式简介

  解释器模式允许我们自定义一种语言,并定义一个这种语言的解释器,这个解释器用来解释语言中的句子。由于这种模式主要用于编译器的编写,因此在日常应用中不是很常用。

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

解释器模式的优点:

  • 可扩展性比较好,灵活;
  • 增加了新的解释表达式的方式;
  • 易于实现简单文法。

解释器模式的缺点:

  • 可利用场景比较少;
  • 对于复杂的文法比较难维护;
  • 解释器模式会引起类膨胀;
  • 解释器模式采用递归调用方法。

解释器模式的使用场景:

  • 可以将一个需要解释执行的语言中的句子表示为一个抽象语法树;
  • 一些重复出现的问题可以用一种简单的语言来进行表达;
  • 一个简单语法需要解释的场景。

2、案例

  在本例中我们定义一个解释器来解决日常的算数问题,如:(a + b) / (a - b + 6) * a。具体代码如下:

  在解释器模式中,每个操作或参数都可以被抽象成一个表达式,因此我们首先定义一个表达式抽象类Expression,代码如下:

public abstract class Expression {
protected String key; public String getKey() {
return key;
} public abstract Expression interpret(Context context);
}

  变量表达式VariableExpression中的代码:

public class VariableExpression extends Expression {
private Integer value; public VariableExpression(String key, Integer value) {
super.key = key;
this.value = value;
} public Integer getValue() {
return value;
} @Override
public Expression interpret(Context context) {
context.addVariable(super.key, value);
return this;
}
}

  加减乘除表达式的代码,这里以除法表达式DivideExpression中的代码为例:

public class DivideExpression extends Expression {
private String resultExpressionKey;
private Expression leftExpression;
private Expression rightExpression; public DivideExpression(String resultExpressionKey, Expression leftExpression, Expression rightExpression) {
this.resultExpressionKey = resultExpressionKey;
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
} @Override
public Expression interpret(Context context) {
Integer rightVariableValue = ((VariableExpression) rightExpression).getValue();
if (rightVariableValue != 0) {
return new VariableExpression(resultExpressionKey,
((VariableExpression) leftExpression).getValue() / rightVariableValue);
}
return null;
}
}

  测试类Test中的代码如下:

/**
* 计算:(a + b) / (a - b + 6) * a
*/
public class Test {
public static void main(String[] args) {
// 上下文对象
Context context = new Context();
// 向上下文对象中添加变量
VariableExpression a = (VariableExpression) new VariableExpression("a", 11).interpret(context);
VariableExpression b = (VariableExpression) new VariableExpression("b", 10).interpret(context);
VariableExpression c = new VariableExpression("c", 6); // 开始计算
Expression tmpResult1 = new AddExpression("tmp1", a, b).interpret(context);
Expression tmpResult2 = new MinusExpression("tmp2", a, b).interpret(context);
Expression tmpResult3 = new AddExpression("tmp3", tmpResult2, c).interpret(context);
Expression tmpResult4 = new DivideExpression("tmp4", tmpResult1, tmpResult3).interpret(context);
Expression tmpResult5 = new MultiplyExpression("tmp5", tmpResult4, a).interpret(context); // 打印结果
System.out.println("结果是:" + ((VariableExpression) tmpResult5).getValue());
}
}

  运行结果如下图所示:

  最后贴出解释器模式在GitHub中的代码地址:【GitHub - Interpreter】

【设计模式 - 15】之解释器模式(Interpreter)的更多相关文章

  1. 《JAVA设计模式》之解释器模式(Interpreter)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述解释器(Interpreter)模式的: 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个 ...

  2. 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

    原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...

  3. 解释器模式 Interpreter 行为型 设计模式(十九)

      解释器模式(Interpreter)   考虑上图中计算器的例子 设计可以用于计算加减运算(简单起见,省略乘除),你会怎么做?    你可能会定义一个工具类,工具类中有N多静态方法 比如定义了两个 ...

  4. C#设计模式:解释器模式(Interpreter Pattern)

    一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易 ...

  5. 二十四种设计模式:解释器模式(Interpreter Pattern)

    解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...

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

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

  7. Java设计模式之九 ----- 解释器模式和迭代器模式

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

  8. 大话设计模式Python实现-解释器模式

    解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 下面是一个解释器模式的demo: #!/usr/ ...

  9. 设计模式之GOF23解释器模式

    解释器模式Interpreter -是一种不常用的设计模式 -用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计 -当我们需要开发一种新的语言时,可以考虑使用解释器 ...

  10. [设计模式] 15 解释器模式 Interpreter

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对解释器模式是这样说的:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.如果一种特定类 ...

随机推荐

  1. markdown2 在win10下无法预览解决方案

    今天升级完Win10发现心爱的markdownPad 2无法预览,显示the view has crashed! 按照官网的Q&A http://markdownpad.com/faq.htm ...

  2. 百度劫持js代码

    js代码为: var myDate=new Date(); //返回一日期对象,可以调用getDate(),内容为当前时间,这句是新建一个对象d建好对象后d就有函数date()中的所有特性 var h ...

  3. Mysql JDBC Url参数说明useUnicode=true&characterEncoding=UTF-8

    MySQL的 JDBC URL 格式 for  Connector/J 如下例: jdbc:mysql://[host][,failoverhost...][:port]/[database] » [ ...

  4. 浅谈购物车中cookie的使用

    购物车对于电商网站来说是一个非常重要的模块.最近自己的项目中也用到了,所以拿出来说说事! 购物车是用户选择商品的一个缓存的地方.其中包含了商品的基本信息,例如:商品的描述,商品的价格,商品的数量等等. ...

  5. jquery 中 form的使用

    纠结了一下 form 表单的提交响应事件,因为在表单中,form标签会让浏览器自动提交,而我一直写的是 $(".btn").click(function()) 提交按钮的响应事件, ...

  6. 使用pyinstaller 2.1将python打包并添加版本信息和图标

    最近用 wxpython写了一个小的脚本,因为想要发布给没有装python和wxpython的人使用,遂决定使用pyinstaller 2.1进行打包. 其中遇到几个问题: 1,给打包的文件添加图标 ...

  7. 快速搭建高速稳定三层B/S架构

  8. Abstract Factory

    工厂模式比较好理解,其实就是通过访问工厂返回单一的对象/多个对象.那么抽象工厂就是返回多个抽象对象.这意味工厂返回对象纵向的一个扩展.但是很多时候,抽象工厂是两个维度的扩展,比方说在数据库类型和表对象 ...

  9. 关于C# json转object时报错:XXXXXXXXXX需要标记“"”,但找到“XX”。

    使用的类:System.Runtime.Serialization.Json.DataContractJsonSerializer //MessagePackage 为要转成的类DataContrac ...

  10. nutch 二次开发

    /*深度控制*/ 深度控制:nutch是广域网的深度遍历,我们需要的是垂直采集(即只采集某一个栏目),举例,索引页总计20页,如果只有下一页,则深度为20,如果是1 2 3 4 5……20则深度为2即 ...