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 相关文章推荐
比file_get_contents稳定的curl_get_contents分享
Jan 11 PHP
php数组中删除元素的实现代码
Jun 22 PHP
php下载文件的代码示例
Jun 29 PHP
实现PHP多线程异步请求的3种方法
Jan 17 PHP
初识php MVC
Sep 10 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
Sep 30 PHP
详解PHP的Yii框架中的Controller控制器
Mar 29 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
PHP身份证校验码计算方法
Aug 10 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
Apr 20 PHP
PHP后端银联支付及退款实例代码
Jun 23 PHP
tp5框架的增删改查操作示例
Oct 31 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
德生9700DX电路分析
2021/03/02 无线电
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
比较时间段一与时间段二是否有交集的php函数
2011/05/31 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
基于jQuery实现动态搜索显示功能
2016/05/05 Javascript
JavaScript 继承详解(五)
2016/10/11 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
vue实现弹幕功能
2019/10/25 Javascript
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python 线程池用法简单示例
2019/10/02 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
Python同时迭代多个序列的方法
2020/07/28 Python
Python与C/C++的相互调用案例
2021/03/04 Python
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
员工自我鉴定范文
2013/10/06 职场文书
新年晚会主持词
2014/03/24 职场文书
三方协议书范本
2014/04/22 职场文书
工商行政管理专业求职书
2014/05/23 职场文书
走进科学观后感
2015/06/18 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
如何使用vue3打造一个物料库
2021/05/08 Vue.js
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android