-
目的
1.一组对象与该对象的单个实例的处理方式一致。(理解的不是很明白)
-
角色
1.Component: 抽象构件,树形结构的根节点,为组合对象声明接口,也可以为共有接口实现缺省行为。(抽象类)
2.leaf: 叶节点,该节点没有子节点,实现抽象构件所声明的接口(叶子)- Compsite: 树形结构的树枝节点,该节点有子节点,实现抽象构件所声明的接口,存储子部件。(根,枝干)
-
优点
1.组合模式灵活性好
-
缺点
1.组合模式因为灵活性好,一个元素或组合在整个系统中可能被调用非常多次,但一旦某个元素或组合在系统中的一个节点出现问题,我们将很难排查到那个节点。
-
代码1
<?php
/**
* 组合模式抽象基类
*/
abstract class CompanyBase{
//节点名称
protected $name;
public function __construct($name){
$this->name = $name;
}
public function getName(){
return $this->name;
}
//增加节点
abstract function add(CompanyBase $c);
//删除节点
abstract function remove(CompanyBase $c);
//输出节点信息
abstract function show($deep);
//节点职责
abstract function work($deep);
}
/**
* 公司类
*/
class Company extends CompanyBase{
protected $item = [];
public function add(CompanyBase $c){
$nodeName = $c->getName();
if(!isset( $this->item[$nodeName] )){
$this->item[$nodeName] = $c;
}else{
throw new Exception("该节点已存在,节点名称:".$nodeName);
}
}
public function remove(CompanyBase $c){
$nodeName = $c->getName();
if(isset( $this->item[$nodeName] )){
unset($this->item[$nodeName]);
}else{
throw new Exception("该节点不存在,节点名称:".$nodeName);
}
}
public function show($deep = 0){
echo str_repeat("-",$deep).$this->name;
echo "<br>";
foreach($this->item as $value){
$value->show($deep+4);
}
}
public function work($deep = 0){
foreach($this->item as $value){
echo str_repeat(" ",$deep)."[{$this->name}]<br>";
$value->work($deep+2);
}
}
}
/**
* 人力资源部门
*/
class HumanResources extends CompanyBase{
public function add(CompanyBase $c){
throw new Exception("该节点下不能增加节点");
}
public function remove(CompanyBase $c){
throw new Exception("该节点下无子节点");
}
public function show($deep = 0){
echo str_repeat("-",$deep).$this->name;
echo "<br>";
}
public function work($deep = 0){
echo str_repeat(" ",$deep)."人力资源部门的工作是为公司招聘人才";
echo "<br>";
}
}
/**
* 商务部门
*/
class Commerce extends CompanyBase{
public function add(CompanyBase $c){
throw new Exception("该节点下不能增加节点");
}
public function remove(CompanyBase $c){
throw new Exception("该节点下无子节点");
}
public function show($deep = 0){
echo str_repeat("-",$deep).$this->name;
echo "<br>";
}
public function work($deep = 0){
echo str_repeat(" ",$deep)."商务部门的工作是为公司赚取利润";
echo "<br>";
}
}
$c = new Company("北京某科技公司");
$h = new HumanResources("人力资源部门");
$com = new Commerce("商务部门");
$c->add($h);
$c->add($com);
//天津分公司
//为了偷懒,分公司的部门直接copy母公司的
$c1 = new Company("天津分公司");
$c1->add($h);
$c1->add($com);
$c->add($c1);
//武汉分公司
$c2 = new Company("武汉分公司");
$c2->add($h);
$c2->add($com);
$c->add($c2);
//使用公司功能
$c->show();
$c->work();
网友评论