注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Copper peas ' Bolg

Keep On Moving...This Is My Life...

 
 
 

日志

 
 

【原】 PHP 设计模式二十三之解释器设计模式  

2011-06-29 11:02:27|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

<?php
/**
 * 数学表达式 解释器设计模式
 * 定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子。它属于类的行为模式。这里的语言意思是使用规定格式和语法的代码。
 * 注意:smarty里只是替换生成了新的一个PHP页面,然后执行,实际只是个替换,而这里的案例是解释
 * 解释器模式案例比较少,网上看了很多,这里参考了漫谈设计模式中的解释器设计模式案例,稍微修改了下,规范了角色,主要是这样更易懂,简单。
 * 使用过的参考:
 * http://developer.51cto.com/art/201004/195624.htm
 * http://www.iteye.com/topic/599901
 * @anthor Chen Wei Han <csq-3@163.com>
 * @copyright Chen Wei Han 2011-6-27下午02:50:57
 * @link http://csq-3.blog.163.com
 * @package demo
 * @version 1.0
 */

/**
 * 简单说下案例:a + 2 中把ab解释成对应设置的数值,解决了一个数学表达式的展现
 * 按照正常的1+2 这里使用ab来解析,并计算了结果。
 */

/**
 *  抽象表达式角色
 */
interface MathExpression 
{      
   public function evaluate($values);
}

/**  
 *  终结符表达式角色。
 */
class Literal implements MathExpression 
{     
    private $_value;
          
 public function __construct($value)     
 {         
      $this->_value = $value;    
 }      
 public function evaluate($values)     
 {        
    return $this->_value;     
 } 
}

/**  
 *  非终结符表达式角色。
 */
class Variable implements MathExpression 

   private $_letter;      
  
   public function __construct($letter)    
   {         
   $this->_letter = $letter;     
   }     
  
   public function evaluate($values)    
   {        
        return $values[$this->_letter];     
   } 
}

/**
 * 上下文(环境)角色,使用Hash数组来存储变量对应的数值
 */
class Content
{
 private $arr;
 
 public function addvalue($key,$value)
 {
  $this->arr[$key] = $value;
 }
 
 public function lookup($key)
 {
  if(array_search($key, $this->arr))
  {
   return $this->arr[$key];
  }
 }
 
 public function getvalue()
 {
  return $this->arr;
 }
}

/**
 * 求和运算符表达式 具体表达式。
 */
class Sum implements MathExpression
{
 private $_a;
 private $_b;
 
 public function __construct($a,$b)
 {
  $this->_a = $a;
  $this->_b = $b;
 }
 
 public function evaluate($values)
 {
  return $this->_a->evaluate($values) + $this->_b->evaluate($values);
 }
}

//配置解释器
$content = new Content;
$content ->addvalue('a',1);
$content ->addvalue('b',2);

//1+2的表达式现在成了new Sum(new Variable('a'), new Literal(2))
$expression = new Sum(new Variable('a'), new Literal(2));

//输出转换表达式后的计算结果
echo $expression->evaluate($content->getvalue()), "\n";

 


 

  评论这张
 
阅读(147)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018