2015年12月15日00:19:02

今天只看了理论和demo,明天再写文章,跑步好累

2015年12月15日21:36:00

解释器模式用来解释预先定义的文法。

《大话设计模式》里面这么定义:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个势力表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。

解释器模式包含以下几个类:

  1. AbstractExpression: 抽象表达式。声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。
  2. TerminalExpression: 终结符表达式。实现与文法中的终结符相关的解释操作。实现抽象表达式中所要求的方法。文法中每一个终结符都有一个具体的终结表达式与之相对应。
  3. NonterminalExpression: 非终结符表达式。为文法中的非终结符相关的解释操作。
  4. Context: 环境类。包含解释器之外的一些全局信息。
  5. Client: 客户类。

优点:

容易改变和扩展文法,因为该模式使用类来标示文法规则,你可使用继承来改变和扩展该文法。也比较容易实现文法,因为定义抽象语法树种各个节点的类实现答题想死,这些类都抑郁编写。

缺点:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护,建议文法复杂的情况下使用其他技术如预防分析程序和编译器生成器来处理。

下面是个demo:

首先创建环境类Context:

package InterpreterPattern;

/*
* 上下文环境类,用来保存文法,包含解释器之外的一些全局信息
*/
public class Context { private String input;
private int output; public Context(String input) {
this.input = input;
} public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public int getOutput() {
return output;
}
public void setOutput(int output) {
this.output = output;
}
}

然后创建抽象的Expression 类:

/**
*
* @ClassName: Expression
* @Description: TODO(解释器的抽象类,抽象解释器的解释操作)
*/
public abstract class Expression {
public abstract void interpret(Context context);
}

然后就是实现抽象类:

自减操作:

package InterpreterPattern;
/**
*
* @ClassName: MinusExpression
* @Description: TODO(自减操作)
*/
public class MinusExpression extends Expression{ @Override
public void interpret(Context context) {
System.out.println("自动递减");
String input = context.getInput();
int inInput = Integer.parseInt(input);
--inInput;
context.setInput(String.valueOf(inInput));
context.setOutput(inInput);
} }

自加操作:

package InterpreterPattern;
/**
*
* @ClassName: PlusExpression
* @Description: TODO(自加操作)
*/
public class PlusExpression extends Expression { @Override
public void interpret(Context context) {
System.out.println("自动递增");
String input = context.getInput();
int inInput = Integer.parseInt(input);
++inInput;
context.setInput(String.valueOf(inInput));
context.setOutput(inInput); } }

测试类:

package InterpreterPattern;

import java.util.ArrayList;
import java.util.List; /**
* @ClassName: Test
* @Description: TODO(测试类)
*/
public class Test { public static void main(String[] args) {
String number = "99";
Context context = new Context(number);
List<Expression> list = new ArrayList<Expression>();
list.add(new PlusExpression());
list.add(new MinusExpression());
for(Expression ex : list) {
ex.interpret(context);
System.out.println(context.getOutput());
}
} }

运算结果为:

自动递增
100
自动递减
99

设计模式 -- 解释器模式(Interpreter Pattern)的更多相关文章

  1. C#设计模式——解释器模式(Interpreter Pattern)

    一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...

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

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

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

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

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

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

  5. javascript设计模式 - 解释器模式(interpreter)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 大话设计模式--解释器模式 interpreter -- C++实现实例

    1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...

  7. 原始的解释器模式(Interpreter Pattern)

    解释器模式的定义(现实项目中非常少遇到,因此直接理论先...) 解释器模式是一种依照规定语法进行解析的方案,在如今项目中使用较少,其定义为:给定一门语言,定义它的方法的一种表示,并定义一个解释器,该解 ...

  8. php解释器模式( interpreter pattern)

    ... <?php /* The interpreter pattern specifies how to evaluate language grammar or expressions. W ...

  9. 设计模式:解释器模式(Interpreter)

    为人处事是一门大学问,察言观色.听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想 ...

  10. 十一个行为模式之解释器模式(Interpreter Pattern)

    定义: 定义一个语言的文法,可以使用一个解释器来解释其文法.定义终结符和非终结符的统一接口,并使用抽象对象建立非终结符与其它元素的关联. 结构图: AbstractExpression:抽象表达式类, ...

随机推荐

  1. 《Django By Example》第六章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:无他,祝大家年会都中奖!) 第六章 ...

  2. js判断移动端与pc端

    这里介绍下使用device.js插件来判断移动端设备 地址:https://github.com/matthewhudson/device.js 示例: if(device.mobile()){ wi ...

  3. 浅谈CSS3 box-reflect 属性

    今天说一下 CSS3的box-reflect属性,也就是倒影特效. 语法: box-reflect:包括3个值. 1. direction 定义方向,取值包括 above . below . left ...

  4. 用备份控制文件做不完全恢复下的完全恢复(数据文件备份<旧>--新建表空间--控制文件备份<次新>--日志归档文件<新>)

    为什么会使用备份的控制文件? 实际工作中主要有两种情况:第一种:当前控制文件全部损坏,而数据文件备份,控制文件备份及当前日志处于不同SCN版本,它们之间又增加过表空间(数据文件).第二种:当前控制文件 ...

  5. 在使用cognos时遇到的问题记录帖

    在使用cognos时遇到的问题记录帖 1.开一个project 报无法访问位于 URL 的服务: http://localhost:80/ibmcognos/cgi-bin/cognos.cgi?b_ ...

  6. [UWP小白日记-9]页面跳转过度动画(二)

    又打算动手写了 [UWP小白日记-6]页面跳转过度动画 上次写的,这次随着学习的进度使用新的玩法. 最近在搞GIT的学习,结果把好好的项目玩坏,都不知道当时是怎么想的拿在写的APP来玩GIT,害我重写 ...

  7. delphi用TAdoStoredProc调用存储过程,兼容sql2005、2008、2014的远程事务问题

    delphi7写的程序,在sql2000里没问题,调用sql2008.2014里的存储过程时,如果存储过程里操作了大量数据,很容易会莫名其妙的自己撤销掉,但是程序还识别不到,认为还在正常执行.今天尝试 ...

  8. 上传代码到GitHub时,遇到错误:fatal,The Requested URL return error 403

    解决: from:pushing-to-git-returning-error-code-403-fatal-http-request-failed

  9. >> 计算机的数据表示

    1. 采用二进制 2. 负数采用补码表示 3. 乘法处理 4. 浮点数

  10. CentOS+OpenCV图像的读入、显示

    以管理员身份运行su root输入密码 定位到自己的桌面目录 gedit 1.cpp 编辑内容 #include<opencv2/opencv.hpp>using namespace cv ...