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 中使用随机数的三个步骤
Oct 09 PHP
PHP动态变静态原理
Nov 25 PHP
通俗易懂的php防注入代码
Apr 07 PHP
php报表之jpgraph柱状图实例代码
Aug 22 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
Yii学习总结之安装配置
Feb 22 PHP
php的4种常见运行方式
Mar 20 PHP
php删除指定目录的方法
Apr 03 PHP
PHP实现获取文件后缀名的几种常用方法
Aug 08 PHP
php结合md5的加密解密算法实例
Sep 30 PHP
PHP实现递归目录的5种方法
Oct 27 PHP
PHP7引入的"??"和"?:"的区别讲解
Apr 08 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获取字符串的编码格式的方法(函数)
2013/06/21 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
python实现神经网络感知器算法
2017/12/20 Python
Python AES加密实例解析
2018/01/18 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
Python os模块常用方法和属性总结
2020/02/20 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
导师评语大全
2014/04/26 职场文书
保证书范文大全
2014/04/28 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
2015年清明节扫墓演讲稿
2015/03/18 职场文书
小马王观后感
2015/06/11 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
总经理致辞
2015/07/29 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书