解释器模式设计路由器

1 模式介绍



  给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。


2 模式中的角色



    1.AbstractExpression(抽象表达式) 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
    
    2.TerminalExpression(终结符表达式) 实现与文法中的终结符相关联的解释操作。 一个句子中的每个终结符需要该类的一个实例。
    
    3.NonterminalExpression(非终结符表达式) 为文法中的非终结符实现解释(Interpret)操作。 
    
    4.Context(上下文) 包含解释器之外的一些全局信息。


3 模式结构

解释器模式设计路由器_第1张图片


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 结果演示

解释器模式设计路由器_第2张图片

你可能感兴趣的:(解释器模式设计路由器)