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 相关文章推荐
Discuz!下Memcache缓存实现方法
May 28 PHP
php GeoIP的使用教程
Mar 09 PHP
php写的带缓存数据功能的mysqli类
Sep 06 PHP
php 生成短网址原理及代码
Jan 23 PHP
php获取文件大小的方法
Feb 26 PHP
php保存信息到当前Session的方法
Mar 16 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
Mar 18 PHP
php使用GD2绘制几何图形示例
Feb 15 PHP
PHP调用Mailgun发送邮件的方法
May 04 PHP
Windows服务器中PHP如何安装redis扩展
Sep 27 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
May 02 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
Dec 01 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
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
FLASH 广告之外的链接
2008/12/16 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
vue生命周期实例小结
2018/08/15 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
JS实现“全选”和"全不选"功能代码实例
2020/02/06 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
Python使用django获取用户IP地址的方法
2015/05/11 Python
python实现线程池的方法
2015/06/30 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
python安装教程
2018/02/28 Python
Python延时操作实现方法示例
2018/08/14 Python
python实现抖音点赞功能
2019/04/07 Python
django的ORM操作 增加和查询
2019/07/26 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
个性婚礼策划方案
2014/05/17 职场文书
机动车登记业务委托书
2014/10/08 职场文书
大学生读书笔记大全
2015/07/01 职场文书
python 如何在list中找Topk的数值和索引
2021/05/20 Python
Python图片处理之图片裁剪教程
2021/05/27 Python
PyTorch device与cuda.device用法
2022/04/03 Python
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers