PHP设计模式之解释器模式的深入解析


Posted in PHP onJune 13, 2013

解释器(Interpreter)模式,它包括一个具有复合类分层结构的文法表现,规则是映射到类,跟随在文法后面的表达式可以被转换成一个抽象的语法树,除了复合模式的实例对象图外,没有别的内容。

树是一个抽象的名词,因为实际上大多数时候它是一个表达式的抽象表现,它忽略了可能有一个字符串,也可能有一个数据结构的具体表达式,(例如,在PHP中,“A”和“\x41”是相同抽象字面值的不同具体表现),通过逻辑规则解耦结果,使解释过程大大简化。

解释器不是一个很常见的模式,但对于简单的语法,它添加一个规则就象添加一个类那样容易,但它没有解决从具体表现形式到抽象语法树的转换,这是由其它服务完成的。

解释器模式旨在为一个简单的抽象表达式(AbstractExpression)方法(解释器操作)实现利用复合分层结构,解释器操作的参数通常统称为上下文,对于给定的一个方法,它们通常被计算值代替,或它们对某些操作可能不存在。

同样,当包含一个解释器时,复合模式的叶子和容器参与者名称会不一样,这些名称反映了它们所扮演的角色:终结符(terminal)或非终结符(nonterminal)表达式。

参与者:
◆客户端(Client):使用解释操作。
◆抽象表达式(AbstractExpression):基于一个表达式树抽象。
◆非终结符表达式(NonTerminalExpression):递归地包含其它抽象表达式(AbstractExpression实例)的表达式。
◆终结符表达式(TerminalExpression):不能够进一步简化的表达式。
PHP设计模式之解释器模式的深入解析

《设计模式》一书针对这个模式提供了一个扩展示例,我将使用数学表达式替换布尔表达式重新改造了一下,因此这个例子解决了一个数学表达式的展现,它的evaluate( )被分离在一个不同的ConcreteExpression类中。

/**  
 * AbstractExpression. All implementations of this interface  
 * are ConcreteExpressions.  
 */ 
interface MathExpression  
{  
    /**  
     * Calculates the value assumed by the expression.  
     * Note that $values is passed to all expression but it  
     * is used by Variable only. This is required to abstract  
     * away the tree structure.  
     */ 
    public function evaluate(array $values);  
}  /**  
 * A terminal expression which is a literal value.  
 */ 
class Literal implements MathExpression  
{  
    private $_value;  
    public function __construct($value)  
    {  
        $this->_value = $value;  
    }  
    public function evaluate(array $values)  
    {  
        return $this->_value;  
    }  
}  
/**  
 * A terminal expression which represents a variable.  
 */ 
class Variable implements MathExpression  
{  
    private $_letter;  
    public function __construct($letter)  
    {  
        $this->_letter = $letter;  
    }  
    public function evaluate(array $values)  
    {  
        return $values[$this->_letter];  
    }  
}  
/**  
 * Nonterminal expression.  
 */ 
class Sum implements MathExpression  
{  
    private $_a;  
    private $_b;  
    public function __construct(MathExpression $a, MathExpression $b)  
    {  
        $this->_a = $a;  
        $this->_b = $b;  
    }  
    public function evaluate(array $values)  
    {  
        return $this->_a->evaluate($values) + $this->_b->evaluate($values);  
    }  
}  
/**  
 * Nonterminal expression.  
 */ 
class Product implements MathExpression  
{  
    private $_a;  
    private $_b;  
    public function __construct(MathExpression $a, MathExpression $b)  
    {  
        $this->_a = $a;  
        $this->_b = $b;  
    }  
    public function evaluate(array $values)  
    {  
        return $this->_a->evaluate($values) * $this->_b->evaluate($values);  
    }  
}  
// 10(a + 3)  
$expression = new Product(new Literal(10), new Sum(new Variable('a'), new Literal(3)));  
echo $expression->evaluate(array('a' => 4)), "\n";  
// adding new rules to the grammar is easy:  
// e.g. Power, Subtraction...  
// thanks to the Composite, manipulation is even simpler:  
// we could add substitute($letter, MathExpression $expr)  
// to the interface...
PHP 相关文章推荐
用Flash图形化数据(二)
Oct 09 PHP
杏林同学录(三)
Oct 09 PHP
PHP5中的时间相差8小时的解决办法
Mar 28 PHP
php zend解密软件绿色版测试可用
Apr 14 PHP
中英文字符串翻转函数
Dec 09 PHP
php ftp文件上传函数(基础版)
Jun 03 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
php获取发送给用户的header信息的方法
Mar 16 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
Feb 04 PHP
php解析xml 的四种简单方法(附实例)
Jul 11 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
php+webSoket实现聊天室示例代码(附源码)
Feb 17 PHP
PHP设计模式之代理模式的深入解析
Jun 13 #PHP
PHP设计模式之责任链模式的深入解析
Jun 13 #PHP
PHP设计模式之结构模式的深入解析
Jun 13 #PHP
PHP设计模式之命令模式的深入解析
Jun 13 #PHP
深入Memcache的Session数据的多服务器共享详解
Jun 13 #PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
Jun 13 #PHP
判断php数组是否为索引数组的实现方法
Jun 13 #PHP
You might like
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
JavaScript日历实现代码
2010/09/12 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
vue服务端渲染缓存应用详解
2018/09/12 Javascript
Python itertools模块详解
2015/05/09 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
Python中整数的缓存机制讲解
2019/02/16 Python
使用python实现kNN分类算法
2019/10/16 Python
python字符串的拼接方法总结
2019/11/18 Python
Python类中self参数用法详解
2020/02/13 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
办公室前台的岗位职责
2013/12/20 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
退税申请报告怎么写
2015/05/18 职场文书
七年级英语教学反思
2016/02/15 职场文书
python opencv通过4坐标剪裁图片
2021/06/05 Python
浅析Django接口版本控制
2021/06/26 Python
MySQL详细讲解变量variables的用法
2022/06/21 MySQL