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中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
如何取得中文字符串中出现次数最多的子串
Aug 08 PHP
php中并发读写文件冲突的解决方案
Oct 25 PHP
smarty表格换行实例
Dec 15 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
PHP实现过滤各种HTML标签
May 17 PHP
PHP微信开发之文本自动回复
Jun 23 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
php中简单的对称加密算法实现
Jan 05 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
Jun 22 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 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
默默简单的写了一个模板引擎
2007/01/02 PHP
crontab无法执行php的解决方法
2016/01/25 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
jquery中each循环的简单回滚操作
2017/05/05 jQuery
JS中定位 position 的使用实例代码
2017/08/06 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
建筑毕业生自我鉴定
2013/10/18 职场文书
会计电算化应届生求职信
2013/11/03 职场文书
大学生毕业自我评价范文分享
2013/11/11 职场文书
酒店中秋节活动方案
2014/01/31 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
晚会闭幕词
2015/01/28 职场文书
项目安全员岗位职责
2015/02/15 职场文书
学年个人总结范文
2015/03/05 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL