abstract class component
public abstract function add(component $c);
public abstract function remove(component $c);
public abstract function display($depth);
}//葉節點沒有子節點
class leaf extends component
//由於葉子沒有再增加分枝和樹葉,所以add和remove方法實現它沒有意義,但這樣做可以消除葉節點和枝節點物件在抽象層次的區別,他們具備完全一致的介面
public function add(component $c)
public function remove(component $c)
public function display($depth)
}//枝節點
class composite extends component
public function add(component $c)
public function remove(component $c)
public function display($depth) }}
//生成樹根root,根上長出leafa和leafb
$root = new composite('root');
$root->add(new leaf('leaf a'));
$root->add(new leaf('leaf b'));
//根上長出分枝composite x,分枝上也有兩葉 leafxa和leafxb
$comp = new composite('composite x');
$comp->add(new leaf("leaf xa"));
$comp->add(new leaf("leaf xb"));
$root->add($comp);
//在composite x上再長出分枝compositexy,分枝上也有兩葉leafxya和leafxyb
$comp2 = new composite('composite xy');
$comp2->add(new leaf('leaf xya'));
$comp2->add(new leaf('leaf xyb'));
$comp->add($comp2);
$root->add(new leaf('leaf c'));
//根部長出兩葉leafc和leafd,可惜leafd沒長牢,被風吹走了
$leaf = new leaf('leaf d');
$root->add($leaf);
$root->remove($leaf);
//顯示大樹的樣子
//公司類
abstract class company
//增加
public abstract function add(company $c);
//移除
public abstract function remove(company $c);
//顯示
public abstract function display($depth);
//履行職責
public abstract function lineofduty();
}//具體公司類 實現介面 樹枝節點
class concretecompany extends company
public function add(company $c)
public function remove(company $c)
public function display($depth)
} //履行職責
public function lineofduty() }}
//人力資源部
class hrdepartment extends company
public function add(company $c)
public function remove(company $c)
public function display($depth)
public function lineofduty()
}//財務部
class financedepartment extends company
public function add(company $c)
public function remove(company $c)
public function display($depth)
public function lineofduty()
}$root = new concretecompany('北京總公司');
$root->add(new hrdepartment('總公司人力資源部'));
$root->add(new financedepartment('總公司財務部'));
$comp = new concretecompany('上海華東分公司');
$comp->add(new hrdepartment('華東分公司人力資源部'));
$comp->add(new financedepartment('華東分公司財務部'));
$root->add($comp);
$comp1 = new concretecompany('南京辦事處');
$comp1->add(new hrdepartment('南京辦事處人力資源部'));
$comp1->add(new financedepartment('南京辦事處財務部'));
$comp->add($comp1);
$comp2 = new concretecompany('杭州辦事處');
$comp2->add(new hrdepartment('杭州辦事處人力資源部'));
$comp2->add(new financedepartment('杭州辦事處財務部'));
$comp->add($comp2);
echo '結構圖:
';$root->display(1);
echo '職責:
';$root->lineofduty();
大話設計模式 組合模式
前言 在 軟體開發過程中,我們經常會遇到處理簡單物件和復合物件的情況,例如對作業系統中目錄的處理就是這樣的乙個例子,因為目錄可以包括單獨的檔案,也可以包括 資料夾,資料夾又是由檔案組成的,由於簡單物件和復合物件在功能上區別,導致在操作過程中必須區分簡單物件和復合物件,這樣就會導致客戶呼叫帶來不必要的...
大話設計模式 組合模式
一 組合模式 將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。二 示例 data public abstract class company public abstract void add company c public abstrac...
大話設計模式之組合模式
將物件組合成樹形結構以表示 部分 整體 的層次結構。組合模式使得使用者對單個物件好人組合物件的使用具有一致性。component為組合中的物件宣告介面,在適當情況下,實現所有類共有介面的預設行為。宣告乙個藉口用於訪問和管理component的子部件 abstractclass component 使...