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 相关文章推荐
如何在PHP中使用Oracle数据库(6)
Oct 09 PHP
php 安全过滤函数代码
May 07 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
Oct 29 PHP
ThinkPHP之import方法实例详解
Jun 20 PHP
php设置静态内容缓存时间的方法
Dec 01 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
yii去掉必填项中星号的方法
Dec 28 PHP
PHP基于ORM方式操作MySQL数据库实例
Jun 21 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
Mar 28 PHP
thinkphp5框架API token身份验证功能示例
May 21 PHP
thinkPHP框架乐观锁和悲观锁实例分析
Oct 30 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
Feb 03 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
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
2015/11/19 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
Javascript与flash交互通信基础教程
2008/08/07 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
Vue响应式原理详解
2017/04/18 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
Python字典循环添加一键多值的用法实例
2019/01/20 Python
python cumsum函数的具体使用
2019/07/29 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
python数值基础知识浅析
2019/11/19 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
2020/02/26 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
语文教育专业推荐信范文
2013/11/25 职场文书
老同学聚会感言
2014/02/23 职场文书
师范生自荐信模板
2014/05/28 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
2014年体育部工作总结
2014/11/13 职场文书
python办公自动化之excel的操作
2021/05/23 Python