聲明:本系列部落格參考資料《大話設計模式》,作者程傑。
組合模式(有時候又叫做部分-整體模式),將對象組合成樹形結構以表示“部分整體”的階層。組合模式使得使用者對單個對象和組合對象的使用具有一致性。它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程式可以像處理簡單元素一樣來處理複雜元素,從而使得客戶程式與複雜元素的內部結構解耦。
實作類別圖:
三大角色:
抽象結構(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物件導向設計模式