解释器模式

<?php
/**
 * @author  v.r  And  
 * 
 * @example
 * 解释器模式
 * 解释器设计模式用于分析一个视图的关键元素,并且针对每一个元素都提供自己的解释或者相应的动作
 * 列子:
 *  用户自定义页面(挂件,添加自己喜爱歌曲CD,等等一些元素) 模板输出
 * 
 * @copyright copyright information
 * 
 */

 header("Content-Type:text/html;charset=utf-8;");

 class User
 {
    protected $userName = '';

    public  function __construct($userName)
    {
        $this->userName = $userName;
    }

    public function getProfilePage()
    {
        $profile = "<h2> I like Never Again</h2>";
        $profile .= "I love all of their songs. my favorite CD:<br/>";
        $profile .= "{{UserCD.getTiTle}}!!!";
        $profile .= "{{UserCD.getFocusMusicList}}";
         $profile .= "{{UserCD.getFocusMusicList}}";
        $profile .= "{{UserNew.getNewList}}";
        return $profile;
    }
 }

 class UserCD 
 {
    public function getTitle() {
        $title = '<<人生不如一切的一切的人生悲剧>>';
        return $title;
    }

    public function getFocusMusicList() {
         $title =<<<LIST
         <ul>
              <li>我爱你</li>
              <li>听海</li>
              <li>每一次的重生都一生的追求</li>
         </ul>
LIST;
        return $title;
    }

 }

 class UserNew 
 {
    public function getNewList()
    {
        $title =<<<LIST
         <em>我喜欢的新闻</em>
         <ul>
              <li>this is a  test</li>
              <li>this is a  test</li>
              <li>this is a  test</li>
         </ul>
LIST;
        return $title;

    }
 }


class UserCDInterpreter {

    protected  $user = NULL ;

    public function setUser(User $user)
    {
        $this->user = $user;
    }

    public function getInterpreter() 
    {
        $profile = $this->user->getProfilePage();
        if (preg_match_all('/\{\{(.*?)\.(.*?)\}\}/', $profile, $triggers,
            PREG_SET_ORDER)) {
            foreach ($triggers as $trigger) {
                $repacements[$trigger[1]][] = $trigger[2];
                # code...
            }
            $repacements = array_map('array_unique', $repacements);
            foreach ($repacements as $class => $funcs) {
                $this->_getInterpreter($class,$funcs,$profile);
            }
            
            # code...
        }
        return $profile;
    }

    public function _getInterpreter($class,$funcs,&$profile)
    {
        $object = new $class;
        foreach ($funcs as $func) {
             # code...
            $profile = str_replace("{{{$class}.{$func}}}",call_user_func(array($object,$func)),$profile);
        } 
        return $profile;
        # code...
    }

}


$username = 'v.r';
$user =  new User($username);
$interpreter = new UserCDInterpreter();
$interpreter->setUser($user);
print $interpreter->getInterpreter();
 #end script


你可能感兴趣的:(解释器模式)