【行为型】Interpreter模式
解释器模式意图为给定的语言定义其文法表示,同时定义该文法表示的一套解释器来解释语言中的句子。该模式说的简单通俗点,其主要用途是用来解释用的。至于解释什么,则要看具体的上下文环境。我们可以为一个表达式专门写一个解释器、也可以为一个语句写一个解释器,一个语句可以看成是由多个表达式构成的、因此,我们同样可以为一段文本写个解释器等等。而在要设计实现一个有效的解释器之前,试想下,首先要做的将是要为待解释的表达式进行其文法定义,即:定义其规则。一个先简单的例子,假如用户自己发明了一个脚本语言。如果想要让该语言行之有效,则必需为其定义各种“规则”,如:关键字是什么、表达式格式是什么、语句的构造又是有哪些约定的、如果有面向对象语法,则对象又是如何表示的、...等等,然后再需要实现一个能够识别这些“规则”并能正确解释、运行它们的编译器。
每个文法定义的一般来说是许许多多的表达式构成的。而复杂表达式又会由更细小的表达式构造成。比如: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模式的更多相关文章
- Java设计模式(17)解释器模式(Interpreter模式)
Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...
- Behavioral模式之Interpreter模式
1.意图 给定一个语言,定义它的文法的一种表示.并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 2.别名 无 3.动机 假设一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各种 ...
- 设计模式(二十三)Interpreter模式
在Interpreter模式中,程序要解决的问题会被用非常简单的“迷你语言”表述出来,即用“迷你语言”编写的“迷你程序”把具体的问题表述出来.迷你程序是无法单独工作的,还需要用java语言编写一个负责 ...
- R型思维模式对软件开发的影响(草稿)
The pragmatic programmers 一直在工作之余读些书,之前主要是纯英文版的计算机相关的算法,编译器,数学等,想通过读这些书来提高自己每日工作效能,结果收效甚微.一是,因为纯英文的书 ...
- 行为型---命令模式(Command Pattern)
命令模式的定义 命令模式属于对象的行为型模式.命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开.命令模式的实现可以提供命令的撤销和恢复功能. ...
- 行为型-命令模式(Command)
装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或者排气扇.在购买开关时,我们并不知道它将来到底用于控制什么电器,也就是说,开关与电灯.排气扇并无直接关系,一 ...
- WebLogic Server 12.1.2后的字符型安装模式
weblogic Server 12.1.1全部都可以用原来方式. WebLogic Server 12.1.2后已经取消了console安装模式,目前只有gui和静默安装模式.并且安装方式下也有很大 ...
- 成长型思维模式Not yet
当做一件事失败了,要告诉他 暂未成功,暂时没有成功,继续努力,下次就有可能成功. 不及格,暂未及格 是两种思维模式,成长性的思维方式得到的是一个是努力型的人格
- JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)
简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实 ...
随机推荐
- ext2,ext3,ext4文件系统管理软件包e2fsprogs
e2fsprogs(也叫做e2fs programs)是一个Ext2(及Ext3/4)文件系统工具集(Ext2 Filesystems Utilities[2] ),它包含了诸如创建.修复.配置.调试 ...
- HDOJ 2200 Eddy's AC难题(数学组合概率题)
Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的ac题目 ...
- 「Githug」Git 游戏通关流程
Githug 他喵的这是个啥!?难道不是 GitHub 拼错了么,和 Git 什么关系? 和游戏又有什么关系? 其实,他的元身在这里:https://github.com/Gazler/githug ...
- Spring 3.2 ClassMetadataReadingVisitor 错误
nested exception is java.lang.IncompatibleClassChangeError: class org.springframework.core.type.clas ...
- iOS NSInvocation的学习
用途: NSInvocation的作用和performSelector:withObject:的作用是一样的:用于iOS编程中调用某个对象的消息. performSelector:withObject ...
- Python logging模块详解
简单将日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.warni ...
- Android中自定义Activity和Dialog的位置大小背景和透明度等
1.自定义Activity显示样式 先在res/values下建colors.xml文件,写入: view plainprint? 1. <?xml version="1.0" ...
- POJ 2001 Shortest Prefixes(字典树)
题目地址:POJ 2001 考察的字典树,利用的是建树时将每个点仅仅要走过就累加.最后从根节点開始遍历,当遍历到仅仅有1次走过的时候,就说明这个地方是最短的独立前缀.然后记录下长度,输出就可以. 代码 ...
- Windows与自定义USB HID设备通信说明.
1 . 所使用的典型 Windows API CreateFile ReadFile WriteFile 以下函数是 DDK 的内容: HidD_SetFeature HidD_GetFeatur ...
- sass笔记-4|像写脚本一样写Sass,把能交给Sass办的都交给它
Sass笔记关于sass的基础部分已经写完,这一篇介绍Sass的高级特性--脚本特性.Sass能做很多事让样式表更智能,我们先会看到Sass眼中的数据类型,在这些数据类型上会有可进行的操作,此外,Sa ...