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

聲明:本系列博客參考資料《大話設計模式》,作者程傑。

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

 

       實現類圖:

      


        三大角色:

       

       抽象結構(Company)角色:此角色實現所有類共有接口的默認行爲,聲明一個接口管理子部件。

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

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


       實現代碼:

      

<?php
/**
 * Created by PhpStorm.
 * User: Jiang
 * Date: 2015/5/2
 * Time: 21:14
 */

/**抽象結構角色          公司
 * Class Company
 */
abstract class Company
{
    protected $name;

    function __construct($name)
    {
        $this->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."<br/>";
        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 "葉子節點,不能繼續添加節點。。。。。。。。。。<br/>";
    }

    /**移除
     * @param Company $company 子公司,部門
     * @return mixed
     */
    function Remove(Company $company)
    {
        echo "葉子節點,不能刪除節點。。。。。。。。。。<br/>";
    }

    /**顯示公司及部門結構
     * @param $depth
     * @return mixed
     */
    function Display($depth)
    {
        $pre="";
        for($i=0;$i<$depth;$i++)
        {
            $pre.="-";
        }
        $pre.=$this->name."<br/>";
        echo $pre;
    }

}

/**葉子節點                    技術部門
 * Class DeptCompany
 */
class TechnologyDept extends Company
{

    function __construct($name)
    {
        parent::__construct($name);
    }

    /**增加
     * @param Company $company 子公司,部門
     * @return mixed
     */
    function Add(Company $company)
    {
        echo "葉子節點,不能繼續添加節點。。。。。。。。。。<br/>";
    }

    /**移除
     * @param Company $company 子公司,部門
     * @return mixed
     */
    function Remove(Company $company)
    {
        echo "葉子節點,不能刪除節點。。。。。。。。。。<br/>";
    }

    /**顯示公司及部門結構
     * @param $depth
     * @return mixed
     */
    function Display($depth)
    {
        $pre="";
        for($i=0;$i<$depth;$i++)
        {
            $pre.="-";
        }
        $pre.=$this->name."<br/>";
        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 "<hr/>";

$root->Remove($shanghai);
$root->Display(3);

         優勢:

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


    歡迎關注我的視頻課程,地址如下,謝謝。


   PHP面向對象設計模式




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章