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加MYSQL服务器
Oct 09 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
Sep 30 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
Nov 08 PHP
php使用curl简单抓取远程url的方法
Mar 13 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
PHP正则表达式之捕获组与非捕获组
Nov 06 PHP
PHP实现多关键字加亮功能
Oct 21 PHP
php和asp语法上的区别总结
May 12 PHP
php策略模式简单示例分析【区别于工厂模式】
Sep 25 PHP
解决laravel查询构造器中的别名问题
Oct 17 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 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
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
php循环输出数据库内容的代码
2008/05/24 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
php简单获取复选框值的方法
2016/05/11 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
Javascript中3个需要注意的运算符
2015/04/02 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
jQuery验证插件validate使用详解
2016/05/11 Javascript
JavaScript队列函数和异步执行详解
2017/06/19 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
教大家玩转Python字符串处理的七种技巧
2017/03/31 Python
python实现Flappy Bird源码
2018/12/24 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
python对csv文件追加写入列的方法
2019/08/01 Python
python绘制动态曲线教程
2020/02/24 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
初中升旗仪式演讲稿
2014/05/08 职场文书
英语教师求职信
2014/06/16 职场文书
2014年团队工作总结
2014/11/24 职场文书
2014年实验室工作总结
2014/12/03 职场文书
学习雷锋精神活动总结
2015/02/06 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL