设计模式の解释器模式

 解释器的概念其实很好理解,假如你女朋友问你你在干嘛呀,这个时候她往往是想你了。奇怪,我们获取到的信息明明是“你在干嘛呀”,但是经过“解释器“处理之后,就变成了“我想你了”。这下子好理解了吧,基于这个特点,解释器模式可以构造一个可以用于创建脚本化应用的迷你语言解释器。

那么解释器模式到底有什么用呢?

假设现在我们做的是一个问卷调查平台,命题人可以通过我们的平台来设计问卷以及问卷答案。为了检测用户输入的数据中是否包含答案,我们知道可以用php的正则表达式来实现,但是,一般命题人或许并不会正则表达式,所以为了方便命题人使用我们的系统,假如我们现在有一套更加容易理解的迷你语言用来设置答案,那么就能大大地提高用户体验。话不多说,让我们来看看具体是怎么实现的(以下只展示解释器部分,实际上还需要解析器部分)

现在我们 的迷你语言中包含这些语法元素,变量,字符串,and(与),equals(相等判断).

首先我们定义一个数据存储类,用来存放于表达式对象相关的数据

interpreterContext类

一个表达式的组成既有操作数,也有操作符。先定义一个表达式抽象基类

expression

在interpret方法中传入interpreterContext对象是因为在对表达式对象的解释过程中会涉及对象的存取,可以看出表达式类是依赖于interpreterContext类的。接下来定义字符串表达式类和变量表达式类,在变量表达式类中我们使用变量名作为变量表达式对象的索引,所以需要对原先抽象父类expression中的getKey方法进行重写,同时也增加了setValue方法用于修改变量值。代码如下:

class  variableExpression extends expression{

                            public $name;//变量名

                            public $value=null;//变量值

                            public function __construct($name,$value){

                                     $this->name=$name;

                                     $this->value=$value;

                             } 

                            public function getKey()

                            {

                                return $this->name;

                            }

                           public function  setValue($value){

                               $this->value=$value;

                          }

                          public function interpret(intepreterContext$context)

                           {

                                     if(!is_null($this->value)) {

                                              $context->insert($this, $this->value);

                                              $this->value=null;

                                      }

                             }

}

还有一点需要注意的,就是在interpret方法中插入变量名和变量值后,将该变量对象的value置空,因为如果后期定义了变量名相同的变量,则在存储空间中该变量名索引所对应的变量值会被更新,如果这里我们没有把已经存储到存储空间的变量对象的变量值属性置空,则后期如果不小心再次调用了该变量对象的interpret方法就会修改当前值,这样显然是不行的。

接下来定义字符串表达式:

stringExpression类

这里字符串对象在存储空间的索引我们采用默认的方式。

到这里我们先来简单总结一下,可以看出操作数对象的解释主要是将与操作数对象相关联的数据放入存储空间,同时为设置索引以便引用。

而对于操作符对象,我们可以将操作符对象理解为一个组合对象(二元操作符的话需要包含两个表达式对象,注意表达式对象可以是操作符对象也可以是操作数对象)。因此,我们定义了一个抽象操作符基类。

有了该操作符抽象基类,我们就可以来定义具体的操作符类了。

下面来演示一下用法,

问题:我和你妈妈掉进水里你救谁

答案:你和妈妈。

为了设置答应,我们可以这样来使用这个迷你语言,假设input是输入,那么我们写出来的语句大概是这样子。input1 equals '你' and input2 equals '妈妈',忽略对语句进行解析的部分,我们直接跳都解释器部分。代码如下:

直到实例化了and操作符对象,我们这时候已经通过传递对象的方式成功构建了一个表达式树,两个equals对象分别包含了一个变量对象和一字符串对象,然后最顶层的And对象包含了两个equals对象。当调用and对象的解释方法时,便会隐式地调用其包含对象的解释方法,最终将and操作结果和and对象的索引写入存储空间。在var_dump之后便可得到一个true。

好了,以上便是解释器模式的基本介绍,由于水平有限未免有不当之处,欢迎指出,希望大家多多鼓励,谢谢~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,605评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,221评论 11 349
  • 短诗六首〈夏日情怀〉 文/红尘一凡 蛙 月色搅动荷塘 阻止不了端坐莲台 诵一段经文,许一个心愿 萤火虫 暮色里来来...
    37度女人_8dda阅读 191评论 0 1
  • 这次的作业在一拖再拖,终于完成了,画的涂的都比较着急,经过这几次的学习,可以拿起笔,首先定位再构图,基本大...
    努力的妍儿阅读 353评论 2 2