解释器模式意图为给定的语言定义其文法表示,同时定义该文法表示的一套解释器来解释语言中的句子。该模式说的简单通俗点,其主要用途是用来解释用的。至于解释什么,则要看具体的上下文环境。我们可以为一个表达式专门写一个解释器、也可以为一个语句写一个解释器,一个语句可以看成是由多个表达式构成的、因此,我们同样可以为一段文本写个解释器等等。而在要设计实现一个有效的解释器之前,试想下,首先要做的将是要为待解释的表达式进行其文法定义,即:定义其规则。一个先简单的例子,假如用户自己发明了一个脚本语言。如果想要让该语言行之有效,则必需为其定义各种“规则”,如:关键字是什么、表达式格式是什么、语句的构造又是有哪些约定的、如果有面向对象语法,则对象又是如何表示的、...等等,然后再需要实现一个能够识别这些“规则”并能正确解释、运行它们的编译器。

每个文法定义的一般来说是许许多多的表达式构成的。而复杂表达式又会由更细小的表达式构造成。比如:C++中的表达式:(3 + 7) * 15;该表达式可被拆解为:表达式一:(3 + 7);表达式二:15;以及表达式三:表达式一的结果 + 表达式二的结果。其中表达式二是最终不可再拆分的最小粒度表达式,称之为终结符表达式TerminalExpression。而最初整个表达式是可拆分的,它是由其他的子表达式构成的(其实如果该例子写的更复杂一些,则这个说明效果可能会更好),称之为非终结符表达式NoterminalExpression。有学过编译原理的人可能知道,编译器(其实就是一种解释器)的一般都是一种语法树的结构,而该语法树中的叶子其实就是这边的表达式二,非叶子是这边的表达式一或最初的整个表达式。对于一个四则运算的表达式的语法树,一般来说,叶子节点都是具体 的数字值,而连接这些数字值的节点一般是四则运算符,如:+-*/等。解释器模式的类结构图参考如下:

模式编码结构参考如下:

 namespace interpreter
{
// 上下文
class Context {}; // 抽象表达式
class IAbstractExpression
{
public:
// some code here........
virtual void interprete(Context* pContext) {} };//class IAbstractExpression class TerminalExpression
{
public:
// some code here........
virtual void interprete(Context* pContext) { /*some code here........*/ } };//class TerminalExpression class NoterminalExpression
{
public:
// some code here........
virtual void interprete(Context* pContext) { /*some code here........*/ } };//class NoterminalExpression }//namespace interpreter

解释器模式编码结构参考

个人的理解,该模式还是挺复杂庞大的。虽说它的意图表述也就是简简单单地一个文法定义、并定义其解释器。而真要设计起来,其粒度还是会挺细的。就比如一个语言,是需要定义非常非常多的表达式的。一个Boolean就需要一个BooleanExpression、一个与运算也需要一个AndExpression表达式、一个变量需要一个变量表达式、一个加号需要一个表达式、...、最终还需要这些简单表达式的复合表达式。总之,为了能够正确解释上下文,需要做足一切准备,而且还需要前期分析的够透彻,否则,表达式的粒度不够细,则后期复用性不足;表达式的粒度太细,则设计起来,可能又会有冗余。另外,解释器模式,其实与复合模式也是非常像的。甚至可以看成是复合模式的一种特例。只是复合模式的意图是更通用的,表示一种“部分-整体”的关系。

【行为型】Interpreter模式的更多相关文章

  1. Java设计模式(17)解释器模式(Interpreter模式)

    Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...

  2. Behavioral模式之Interpreter模式

    1.意图 给定一个语言,定义它的文法的一种表示.并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 2.别名 无 3.动机 假设一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各种 ...

  3. 设计模式(二十三)Interpreter模式

    在Interpreter模式中,程序要解决的问题会被用非常简单的“迷你语言”表述出来,即用“迷你语言”编写的“迷你程序”把具体的问题表述出来.迷你程序是无法单独工作的,还需要用java语言编写一个负责 ...

  4. R型思维模式对软件开发的影响(草稿)

    The pragmatic programmers 一直在工作之余读些书,之前主要是纯英文版的计算机相关的算法,编译器,数学等,想通过读这些书来提高自己每日工作效能,结果收效甚微.一是,因为纯英文的书 ...

  5. 行为型---命令模式(Command Pattern)

    命令模式的定义 命令模式属于对象的行为型模式.命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开.命令模式的实现可以提供命令的撤销和恢复功能. ...

  6. 行为型-命令模式(Command)

    装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或者排气扇.在购买开关时,我们并不知道它将来到底用于控制什么电器,也就是说,开关与电灯.排气扇并无直接关系,一 ...

  7. WebLogic Server 12.1.2后的字符型安装模式

    weblogic Server 12.1.1全部都可以用原来方式. WebLogic Server 12.1.2后已经取消了console安装模式,目前只有gui和静默安装模式.并且安装方式下也有很大 ...

  8. 成长型思维模式Not yet

    当做一件事失败了,要告诉他 暂未成功,暂时没有成功,继续努力,下次就有可能成功. 不及格,暂未及格  是两种思维模式,成长性的思维方式得到的是一个是努力型的人格

  9. JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)

    简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实 ...

随机推荐

  1. 利用ordered hints优化SQL

    SQL_ID  4g70n3k9bqc5v, child number 0 ------------------------------------- MERGE INTO YJBZH_GRXDFHZ ...

  2. HDU3549 Flow Problem(网络流增广路算法)

    题目链接. 分析: 网络流增广路算法模板题.http://www.cnblogs.com/tanhehe/p/3234248.html AC代码: #include <iostream> ...

  3. String的equals方法和==

    String类的对象是字符串常量,一切看起来改变了String对象的操作,其实只是改变了字符串引用变量所引用的字符串罢了. Java中的字符串存放在一个公共的存储池中,引用指向存储池中相应的位置,编译 ...

  4. [Java] List / ArrayList - 源代码学习笔记

    在阅读 List / ArrayList 源代码过程中,做了下面的笔记. LinkedList 的笔记较多,放到了另一篇博文 LinkedList / Queue- 源代码学习笔记 List List ...

  5. migration vmware vms to openstack kvm 修改vmware windows scsi to ide

  6. 利用MyEclipse的ant插件生成Hibernate的映射文件

    先下载:xdoclet-plugins-dist-1.0.4-bin build.xml文件 <?xml version="1.0" encoding="UTF-8 ...

  7. 数据结构 - 求二叉树中结点的最大距离(C++)

    // ------BTreeMaxNodeLength.cpp------ #include <iostream> using namespace std; template <cl ...

  8. android 监听短信数据库,制作短信控制工具,控制别人的手机!!(一)

    序言:本程序示例本着简洁易懂的目的,只做了简单的功能实现,需要用户启动应用,收到短信才有效果.作者将会在后面的(二)篇中加入服务后台运行.自动启动功能,实现一个真正的短信控制工具.本文的目的很简单,让 ...

  9. [Protractor] Test Simple Binding With Protractor

    Protractor is built to interact with AngularJS applications. In this lesson, we will take a look at ...

  10. TinyXml高速入门(一)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 对于xml文件,眼下我的工作仅仅是集中在配置文件和作为简单的信息文件来用,因此我不太喜欢使用msxml这样的重量级的x ...