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 相关文章推荐
DOMXML函数笔记
Oct 09 PHP
动态生成gif格式的图像要注意?
Oct 09 PHP
360通用php防护代码(使用操作详解)
Jun 18 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
php实现cookie加密的方法
Mar 10 PHP
大家都应该掌握的PHP关联数组使用技巧
Dec 25 PHP
PHP浮点比较大小的方法
Feb 14 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
Mar 09 PHP
php根据数据id自动生成编号的实现方法
Oct 16 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
PHP快速排序算法实现的原理及代码详解
Apr 03 PHP
php session_decode函数用法讲解
May 26 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
JavaScript delete 属性的使用
2009/10/08 Javascript
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
2013/11/07 Javascript
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
vue实现日历表格(element-ui)
2020/09/24 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Python的组合模式与责任链模式编程示例
2016/02/02 Python
十条建议帮你提高Python编程效率
2016/02/16 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
python ---lambda匿名函数介绍
2019/03/13 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
django-csrf使用和禁用方式
2020/03/13 Python
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
什么是类的返射机制
2016/02/06 面试题
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
培训心得体会
2013/12/29 职场文书
公司道歉信范文
2014/01/09 职场文书
空乘英文求职信
2014/04/13 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL
Windows server 2016服务器基本设置
2022/08/14 Servers