面向对象的洗礼:设计模式(二十七)之解释器模式
解释器模式,作为PHPer应该非常非常非常熟悉的一种,尽管不知道它叫做解释器模式,但是肯定使用过它。在解释器模式的最佳应用,就是大量优秀的模板引擎。解释器模式解决了一种特定的类型的问题发生的频率足够高,那么就可能值得将该问题的各个势力表述为一个简单的语言中的句子。这就构建了一个解释器,解释器他哦各国解释这些句子来解决问题。
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
比如:模板引擎smart;比如论坛的UBB代码,就是用[url=http://www.lanecn.com]LaneBlog[/url]来表示<a href="http://www.lanecn.com/>LaneBlog</a>;还比如正则表达式等
场景:a表示你,b表示好,c表示世界。1表示我说,2表示你说。以PHP为代码环境,模拟设计模式之解释器模式的代码实现。
<?php class Content{ private $content = ''; public function get(){ return $this->content; } public function set($content){ $this->content = $content; } } class Expression{ public function interpret($contentObj){ $content = $contentObj->get(); if(!empty($content)){ $lenth = strlen($content); for($i=0; $i<$lenth; $i++){ if(is_numeric($content[$i])){ Number::excute($content[$i]); }else if(is_string($content[$i])){ String::excute($content[$i]); } } } } } class Number{ public static function excute($value){ $data = ''; switch($value){ case 1: $data = '我说:'; break; case 2: $data = '你说:'; break; default: break; } echo $data; } } //a表示你,b表示好,c表示世界。1表示我说,2表示你说 class String{ public static function excute($value){ $data = ''; switch($value){ case 'a': $data = '你'; break; case 'b': $data = '好'; break; case 'c': $data = '世界'; break; default: break; } echo $data; } } //客户端/接口 $contentObj = new Content(); $str = '1abc'; $contentObj->set($str); echo '解密' . $str . ':<br>'; $expression = new Expression(); $expression->interpret($contentObj); echo '<br>'; $str = '2abc'; $contentObj->set($str); echo '解密' . $str . ':<br>'; $expression = new Expression(); $expression->interpret($contentObj);