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代码
Mar 08 PHP
随时给自己贴的图片加文字的php水印
Mar 16 PHP
php对gzip文件或者字符串解压实例参考
Jul 25 PHP
php 404错误页面实现代码
Jun 22 PHP
PHP HTML代码串 截取实现代码
Jun 29 PHP
PHP文件注释标记及规范小结
Apr 01 PHP
PHP防止刷新重复提交页面的示例代码
Nov 11 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
PHP身份证校验码计算方法
Aug 10 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
php扩展开发入门demo示例
Sep 23 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 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学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
php构造函数实例讲解
2013/11/13 PHP
PHP实现变色验证码实例
2014/01/06 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
2016/06/12 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
python文件写入实例分析
2015/04/08 Python
Python实现对比不同字体中的同一字符的显示效果
2015/04/23 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
pandas计数 value_counts()的使用
2019/06/24 Python
Python-openCV开运算实例
2020/07/05 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
JAVA中运算符的分类及举例
2015/09/12 面试题
制药工程专业应届生求职信
2013/09/24 职场文书
行政副总岗位职责
2014/02/23 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
工程承诺书怎么写
2014/05/24 职场文书
设计师求职信
2014/07/01 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
小学语文国培研修日志
2015/11/13 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
python 闭包函数详细介绍
2022/04/19 Python