php核心學習-設計模式的學習-註冊樹模式

來源:互聯網
上載者:User
寫在前面:設計模式的學習需要帶進情境進行學習,然後總結,才會發現老司機的套路之美,本文帶著這樣的上一篇課程原廠模式的一個問題,如果我們客戶需要在買書的時候,順便把酒也查詢出來,一般的寫法是我們先建立一個書的執行個體,然後調用查詢,在調用酒的執行個體,然後調用查詢的方法,資料量小的時候,感覺還不錯,但是,當我們的產品很多的話,就變得很臃腫了,那麼現在我們來學習一個新的設計模式--註冊樹模式來解決這個問題。
什麼是註冊樹模式。


  註冊樹模式當然也叫註冊模式,註冊器模式。註冊樹模式通過將對象執行個體註冊到一棵全域的對象樹上,需要的時候從對象樹上採摘的模式設計方法。


為什麼要採用註冊樹模式。


  單例模式解決的是如何在整個項目中建立唯一對象執行個體的問題,原廠模式解決的是如何不通過new建立執行個體對象的方法。 那麼註冊樹模式想解決什麼問題呢。 在考慮這個問題前,我們還是有必要考慮下前兩種模式目前面臨的局限。  首先,單例模式建立唯一對象的過程本身還有一種判斷,即判斷對象是否存在。存在則返回對象,不存在則建立對象並返回。 每次建立執行個體對象都要存在這麼一層判斷。 原廠模式更多考慮的是擴充維護的問題。 總的來說,單例模式和原廠模式可以產生更加合理的對象。怎麼方便調用這些對象呢。而且在項目內如此建立的對象好像散兵遊勇一樣,不便統籌管理安排啊。因 而,註冊樹模式應運而生。不管你是通過單例模式還是原廠模式還是二者結合產生的對象,都統統給我“插到”註冊樹上。我用某個對象的時候,直接從註冊樹上取 一下就好。這和我們使用全域變數一樣的方便實用。 而且註冊樹模式還為其他模式提供了一種非常好的想法。


如何?註冊樹。


  通過上述的描述,我們似乎很容易就找到瞭解決方法。首先我們需要一個作為註冊樹的類,這毋庸置疑。所有的對象“插入”到註冊樹上。這個註冊樹應 該由一個靜態變數來充當。而且這個註冊樹應該是一個數組。這個類應該有一個插入對象執行個體的方法(set()),當讓相對應的就應該有一個撤銷對象執行個體 的方法(_unset())。當然最重要的是還需要有一個讀取對象的方法(get()),讀取對象的方法我們使用魔術方法遍曆出執行個體化類的屬性。擁有這些,我們就可以愉快地完成註冊樹模式啦~~~


  上一篇產品類這裡就不重複了,重點講解註冊樹的實現,實現如下:
<?php class  ProductDataCenter {     public  static $objectList=[];//對象數組 ,儲存//將執行個體化的對象插入到靜態陣列變數當中     public static function set($k,$v)     {         self::$objectList[$k]=$v;     }//刪除數組     public static function remove($k)     {         unset(self::$objectList[$k]);     }    /* public static function get($k)     {         return self::$objectList[$k];     }*///從對象樹種採摘對象的屬性,返回     public static function __callStatic($name, $arguments)     {         // TODO: Implement __callStatic() method.         $return=[];//預設傳回值        foreach(self::$objectList as $k=>$v){if(method_exists($v,$name)){$ret=$v->$name($arguments);if($ret){$return[]=$ret;}}}return $return;}}


工廠類調用註冊樹的方式:
<?phprequire("IProduct.php");require("ProductDataCenter.php");class ProductFactory{    //商品工廠類    static  function getProduct($type)    {        $obj=false;        if(!class_exists($type))        {            require($type.".php");        }        switch($type)        {            case "Books":                $obj=new Books();                break;            case "Dogs":                $obj=new Dogs();                break;            case "Wines":                $obj=new Wines();                break;        }        if(is_subclass_of($obj,"IProduct"))            ProductDataCenter::set($type,$obj);//把建立的對象塞入對象樹種    }}


客戶調用
ProductFactory::getProduct(["Books","Dogs"]);var_export(ProductDataCenter::getList()


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.