PHP设计模式--解释器模式

 解释器模式(Interpreter) 理解起来挺难的,但是这种设计模式不常用。

 适用于文法比较简单的程序,一旦文法复杂度大了,后期难以维护。
 定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,每个文法可以表示成一个类,只需要扩展文法类,通过统一的解释器类进行调用解释。

 比方说现在有一个解释器,可以把字母解释成一个完整的单词,如果需要扩展,可以创建第二个文法类,解释成其他的意思(如中文)。

<?php  
header("Content-Type:text/html;charset=utf-8");  
  
require_once "Interpreter.php";  
  
// 密文接口  
$secretword = new SecretWord();  
  
// 添加密文  
$secretword->content="A B C D E F";   
  
  
while(!empty($secretword->content))    
{    
    // 可以使用两种文法  
    $Grammar = new Grammar1();     // 解析英文  
    // $Grammar = new Grammar2();  // 解析中文    
  
    // 解释  
    echo $Grammar->Translate($secretword)."<br/>";    
} 

<?php  
  
  
// 密文接口  
Class SecretWord  
{  
    /** 
     * 密文 
     * @var string  
     */  
    public $content;  
}  
  
// 解释器抽象类  
abstract class Interpreter    
{    
  
    /** 
     * 解释方法 
     * @access public  
     * @param  object $secretword 密文内容 
     */  
    public function Translate(SecretWord $secretword)    
    {    
        if(empty($secretword->content))    
        {    
            return false;    
        }    
  
        $key=mb_substr($secretword->content,0,1);    
  
        $secretword->content=mb_substr($secretword->content,1);   
  
        return $this->Excute($key);    
    }   
  
    /** 
     * 执行方法 
     * @access public  
     * @param  string $key 密文 
     */    
    public abstract function Excute($key);    
}    
  
// 英文文法类  
Class Grammar1 extends Interpreter  
{  
  
    /** 
     * 执行方法 
     * @access public  
     * @param  string $key 密文 
     */  
    public function Excute($key)  
    {  
        $letter = "";  
        switch($key)  
        {  
            case "A":  
                $letter = "Apple";  
                break;  
            case "B":  
                $letter = "Blue";  
                break;  
            case "C":  
                $letter = "China";  
                break;  
            case "D":  
                $letter = "Double";  
                break;  
            case "E":  
                $letter = "Egg";  
                break;  
            case "F":  
                $letter = "France";  
                break;  
  
        }  
        return $letter;  
    }  
}  
  
// 中文文法类  
Class Grammar2 extends Interpreter  
{  
    /** 
     * 执行方法 
     * @access public  
     * @param  string $key 密文 
     */  
    public function Excute($key)  
    {  
        $letter = "";  
        switch($key)  
        {  
            case "A":  
                $letter = "苹果";  
                break;  
            case "B":  
                $letter = "蓝色";  
                break;  
            case "C":  
                $letter = "中国";  
                break;  
            case "D":  
                $letter = "双数";  
                break;  
            case "E":  
                $letter = "鸡蛋";  
                break;  
            case "F":  
                $letter = "法兰西";  
                break;  
  
        }  
        return $letter;  
    }  
}  

输出结果:Grammar1

Apple

Blue

China

Double

Egg

France

输出结果:Grammar2

苹果

蓝色

中国

双数

鸡蛋

法兰西

猜你喜欢

转载自blog.csdn.net/xhanguomzhu/article/details/79986419
今日推荐