PHP設計模式--組合器模式

來源:互聯網
上載者:User
聲明:本系列部落格參考資料《大話設計模式》,作者程傑。

組合模式(有時候又叫做部分-整體模式),將對象組合成樹形結構以表示“部分整體”的階層。組合模式使得使用者對單個對象和組合對象的使用具有一致性。它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程式可以像處理簡單元素一樣來處理複雜元素,從而使得客戶程式與複雜元素的內部結構解耦。


實作類別圖:


三大角色:

抽象結構(Company)角色:此角色實現所有類共有介面的預設行為,聲明一個介面管理子組件。

葉子節點(Technology)角色:表示葉子物件,沒有子節點。

枝節點(SubCompany)角色:用來儲存子組件,實現與子組件有關的操作,如Add()等。


實現代碼:

name=$name;    }    /**增加     * @param Company $company    子公司,部門     * @return mixed     */    abstract function Add(Company $company);    /**移除     * @param Company $company   子公司,部門     * @return mixed     */    abstract function Remove(Company $company);    /**顯示公司及部門結構     * @param $depth     * @return mixed     */    abstract function Display($depth);}/**枝節點               子公司 * Class Beijing */class SubCompany extends Company{    private $sub_companys=array();    function __construct($name)    {        parent::__construct($name);    }    function Add(Company $company)    {        $this->sub_companys[]=$company;    }    function Remove(Company $company)    {        $key=array_search($company,$this->sub_companys);        if($key!==false)        {            unset($this->sub_companys[$key]);        }    }    function Display($depth)    {        $pre="";        for($i=0;$i<$depth;$i++)        {            $pre.="-";        }        $pre.=$this->name."
"; echo $pre; foreach($this->sub_companys as $v) { $v->Display($depth+2); } }}/**葉子節點 財務部 * Class DeptCompany */class MoneyDept extends Company{ function __construct($name) { parent::__construct($name); } /**增加 * @param Company $company 子公司,部門 * @return mixed */ function Add(Company $company) { echo "葉子節點,不能繼續添加節點。。。。。。。。。。
"; } /**移除 * @param Company $company 子公司,部門 * @return mixed */ function Remove(Company $company) { echo "葉子節點,不能刪除節點。。。。。。。。。。
"; } /**顯示公司及部門結構 * @param $depth * @return mixed */ function Display($depth) { $pre=""; for($i=0;$i<$depth;$i++) { $pre.="-"; } $pre.=$this->name."
"; echo $pre; }}/**葉子節點 技術部門 * Class DeptCompany */class TechnologyDept extends Company{ function __construct($name) { parent::__construct($name); } /**增加 * @param Company $company 子公司,部門 * @return mixed */ function Add(Company $company) { echo "葉子節點,不能繼續添加節點。。。。。。。。。。
"; } /**移除 * @param Company $company 子公司,部門 * @return mixed */ function Remove(Company $company) { echo "葉子節點,不能刪除節點。。。。。。。。。。
"; } /**顯示公司及部門結構 * @param $depth * @return mixed */ function Display($depth) { $pre=""; for($i=0;$i<$depth;$i++) { $pre.="-"; } $pre.=$this->name."
"; echo $pre; }}

測試代碼:

header("Content-Type:text/html;charset=utf-8");//------------------------組合器模式測試代碼------------------require_once "./Composer/Composer.php";$root=new SubCompany("北京總公司");$root->Add(new MoneyDept("總公司財務部"));$root->Add(new TechnologyDept("總公司技術部"));$shanghai=new SubCompany("上海分公司");$shanghai->Add(new TechnologyDept("上海分公司技術部"));$shanghai->Add(new MoneyDept("上海分公司財務部"));$root->Add($shanghai);$root->Display(1);echo "";$root->Remove($shanghai);$root->Display(3);

優勢:

組合模式讓你可以最佳化處理遞迴或分級資料結構。有許多關於分級資料結構的例子,使得組合模式非常有用武之地。關於分級資料結構的一個普遍性的例子是你每次使用電腦時所遇到的:檔案系統。檔案系統由目錄和檔案組成。每個目錄都可以裝內容。目錄的內容可以是檔案,也可以是目錄。按照這種方式,電腦的檔案系統就是以遞迴結構來組織的。如果你想要描述這樣的資料結構,那麼你可以使用組合模式Composite。


PHP物件導向設計模式

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.