解释器模式(Interpreter)
理解起来挺难的,但是这种设计模式不常用。
适用于文法比较简单的程序,一旦文法复杂度大了,后期难以维护。
定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,每个文法可以表示成一个类,只需要扩展文法类,通过统一的解释器类进行调用解释。
输出结果:Grammar1
适用于文法比较简单的程序,一旦文法复杂度大了,后期难以维护。
定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,每个文法可以表示成一个类,只需要扩展文法类,通过统一的解释器类进行调用解释。
比方说现在有一个解释器,可以把字母解释成一个完整的单词,如果需要扩展,可以创建第二个文法类,解释成其他的意思(如中文)。
<?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
苹果
蓝色
中国
双数
鸡蛋
法兰西