PHP中实用的模式之【门面模式】_PHP_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > PHP > PHP中实用的模式之【门面模式】

PHP中实用的模式之【门面模式】

 2013/11/3 11:16:28  乌鸟heart  程序员俱乐部  我要评论(0)
  • 摘要:author:胡旭个人博客blog:http://www.ihuxu.com欢迎关注~~~~对于一些逻辑稍微复杂的程序,很难避免出现在不某个类中无法访问另一个类所持有的引用。这样也就导致了编程的灵活度下降,尽管可以再次创建新的引用,也会浪费资源,甚至达不到要求。下面我来句一个例子:比如,后台的模板文件有两个。admin_bar.html,和admin_comment.html。我现在有两个类,分别是adminAction.class.php,和adminCommentAction.class
  • 标签:PHP 实用 模式

? ? ? ?author:胡旭个人博客

? ? ? ?blog:http://www.ihuxu.com

? ? ? ?欢迎关注~~~~

?

? ? ? ? 对于一些逻辑稍微复杂的程序,很难避免出现在不某个类中无法访问另一个类所持有的引用。这样也就导致了编程的灵活度下降,尽管可以再次创建新的引用,也会浪费资源,甚至达不到要求。下面我来句一个例子

? ? ? ? 比如,后台的模板文件有两个。admin_bar.html,和admin_comment.html。我现在有两个类,分别是adminAction.class.php,和adminCommentAction.class.php。admin_bar.html文件就是我们通常看到的后台管理的工具栏(通常在左边),admin_comment.html是每个工具功能项(评论)所对应的内容。如下图所示:

?

? ? ? ? 这样,我们在adminAction控制器类中先用模板引擎处理好admin_bar.html文件,完了根据url或表单传进来的参数进入到adminCommentAction控制器类。代码示例:

? ? ? ??

logs_code_copy">复制代码
 1 <?php
 2 class adminAction{
 3         
 4         private $smarty = null;
 5         
 6         public function _construct(){
 7             $this->smarty = new Smarty();
 8             
 9         }
10         
11         private function show(){
12             $this->smarty->dispose('admin_bar.html');
13             if($_GET['action'] == 'comment'){
14                 new adminCommentAction();
15             }
16             if(){
17                 //...
18             }
19             return;
20         }
21 }
22 
23 class adminCommentAction{
24     public function _construct(){
25         //???
26     }
27 }
复制代码

?

?

? ? ? ? 那么,到代码执行到adminCommentAction中时,就无法拿到adminAction中持有的smarty引用了。也许说,可以通过构造参数来传递,不过这里介绍一种更好的方式 --- 门面模式(总于进入主题了)。它能够更灵活的管理代码程序中的饮用对象。下面简单的门面模式类代码示例:

复制代码
 1 <?php
 2 /**
 3  * 对象引用管家 - 门面模式
 4  */
 5 class ObjectManager implements ObjectType{
 6     private static $Objects = array();
 7     
 8     public static final function get_object($key){
 9         
10         if(array_key_exists($key, ObjectManager::$Objects)){
11             return ObjectManager::$Objects[$key];
12         }
13         return FALSE;
14     }
15 
16     public static final function set_object($key, $Object){
17         if(!array_key_exists($key, ObjectManager::$Objects)){
18             ObjectManager::$Objects[$key] = $Object;
19             return TRUE;
20         }
21         return FALSE;
22     }
23     
24     public static final function clear_object($key){
25         if(array_key_exists($key, ObjectManager::$Objects)){
26             unset(ObjectManager::$Objects[$key]);
27             return TRUE;
28         }
29         return FALSE;
30     }
31 }
复制代码

? ? ? ? 当然,最好给ObjectManager写一个接口类,其中存一些引用的类型,以便处理。

复制代码
<?php
/**
 * 全局对象引用类型常量接口
 *
 */
interface ObjectType{
    
    /**
     * 后台控制器adminAction所持有的Smarty引用对象,其用于相应模板文件的模板引擎动作。
     * 
     */
    const ADMINACTIONENGIEN= 'AdminActionEngien';
    
    
}
复制代码

? ? ? ? 那么这个时候就可以这样灵活的运用了,代码示例:

复制代码
 1 <?php
 2 class adminAction{
 3         
 4         private $smarty = null;
 5         
 6         
 7         public function _construct(){
 8             $this->smarty = new Smarty();
 9             ObjectManager::set_object(ObjectManager::ADMINACTIONENGIEN, $this->smarty);
10         }
11         
12         private function show(){
13             $this->smarty->dispose('admin_bar.html');
14             if($_GET['action'] == 'comment'){
15                 new adminCommentAction();
16             }
17             if(){
18                 //...
19             }
20             return;
21         }
22 }
23 
24 class adminCommentAction{
25     private $smarty = null;
26     public function _construct(){
27         $this->smarty =  ObjectManager::get_object(ObjectManager::ADMINACTIONENGIEN);
28         $this->smarty->require_file();//这个函数可能smarty没有,因为我用的引擎是自己写的
29         $this->smarty->assign();
30         $this—>smarty->display();
31     }
32 }
复制代码

?

发表评论
用户名: 匿名