1 模式介绍
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
2 模式中的角色
1.AbstractExpression(抽象表达式) 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
2.TerminalExpression(终结符表达式) 实现与文法中的终结符相关联的解释操作。 一个句子中的每个终结符需要该类的一个实例。
3.NonterminalExpression(非终结符表达式) 为文法中的非终结符实现解释(Interpret)操作。
4.Context(上下文) 包含解释器之外的一些全局信息。
3 模式结构
4 项目
4.1 需求分析
设计一个简单的路由器,能够对url实现rewrit和对数字url的解析。
4.2 类图设计
4.3 源码设计
<?php
/**
* 解释器模式
* copyright (c) http://blog.csdn.net/CleverCode
*
*/
//解释器的全局信息
class Context
{/*{{{*/
public $fromUrl;//输入的url
public $realUrl;//真实的rul
public function __construct($fromUrl = '',$realUrl = '')
{
$this->fromUrl = $fromUrl;
$this->realUrl = $realUrl;
}
public function setFromUrl($fromUrl)
{
$this->fromUrl = $fromUrl;
}
public function getFromUrl()
{
return $this->fromUrl;
}
public function setRealUrl($realUrl)
{
$this->realUrl = $realUrl;
}
public function getRealUrl()
{
return $this->realUrl;
}
}/*}}}*/
//路由规则
interface RouterRule
{/*{{{*/
//解释
public function interpret(Context $context);
//获取真实的规则
public function getRealUrl();
}/*}}}*/
//映射类规则
class RewriteRouterRule implements RouterRule
{/*{{{*/
public $fromUrl;//输入的url
public $realUrl;//真实的rul
public function __construct($fromUrl = '',$realUrl = '')
{
$this->fromUrl = $fromUrl;
$this->realUrl = $realUrl;
}
public function interpret(Context $context)
{
if($context->getFromUrl() == $this->fromUrl)
{
return true;
}
return false;
}
public function getRealUrl()
{
return $this->realUrl;
}
}/*}}}*/
//数字转化类
class DigRouterRule implements RouterRule
{/*{{{*/
public $realUrl;//真实的rul
public function interpret(Context $context)
{
$fromUrl = $context->getFromUrl();
if(is_numeric($fromUrl))
{
$this->setRealUrl('/index/index?id='.$fromUrl);
return true;
}
return false;
}
public function getRealUrl()
{
return $this->realUrl;
}
public function setRealUrl($realUrl)
{
$this->realUrl = $realUrl;
}
}/*}}}*/
//路由器
class Router
{/*{{{*/
public $rules = array();
public function addRule(RouterRule $rule)
{
$this->rules[] = $rule;
}
//调度
public function dispatch(Context $context)
{
foreach($this->rules as $rule)
{
if($rule->interpret($context))
{
$context->setRealUrl($rule->getRealUrl());
return true;
}
}
return false;
}
}/*}}}*/
class Client
{/*{{{*/
public static function main($argv)
{
$router = new Router();
//规则:将old解析是new的Url上
$rule1 = new RewriteRouterRule('/so/old','/so/new');
$router->addRule($rule1);
//规则:数字路由
$rule2 = new DigRouterRule();
$router->addRule($rule2);
$context = new Context();
//$context->setFromUrl('/so/old');
//$context->setFromUrl('/so/xxx');
//$context->setFromUrl(888);
$context->setFromUrl('8899a');
//解释
if($router->dispatch($context))
{
echo "解释成功:from ".$context->getFromUrl()." to RealUrl:".$context->getRealUrl()."\r\n";
}
else
{
echo "解释失败:from ".$context->getFromUrl()."\r\n";
}
}
}/*}}}*/
Client::main($argv);
?>
4.4 结果演示
技术交流
CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!