组合模式(Composite)
介绍
结构型模式,把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
何时使用:提现整体和部分层次结构,忽略组合对象和单个对象的不同,可以统一使用组合结构中的所有对象。
优点:
- 模块调用简单;
- 节点自由度增加。
缺点:
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
代码实现:
<?php
abstract class CompanyBase{
protected $name;
function __construct($name){
$this->name = $name;
}
function getName(){
return $this->name;
}
abstract function add($c);
abstract function remove($c);
abstract function show($deep);
}
class Company extends CompanyBase{
protected $item = [];
function add($c){
$nodeName = $c->getName();
if(!isset( $this->item[$nodeName] ))
$this->item[$nodeName] = $c;
else
throw new Exception("The node already exists,name:".$nodeName);
}
function remove($c){
$nodeName = $c->getName();
if(isset( $this->item[$nodeName] ))
unset($this->item[$nodeName]);
else
throw new Exception("The node not exists,name:".$nodeName);
}
function show($deep = 0){
echo str_repeat("-",$deep).$this->name;
echo "<br>";
foreach($this->item as $value){
$value->show($deep+4);
}
}
}
class TechDep extends CompanyBase{
function add($c){
throw new Exception("The Node can not add node");
}
function remove($c){
throw new Exception("The Node have not child node");
}
function show($deep = 0){
echo str_repeat("-",$deep).$this->name;
echo "<br>";
}
}
$c = new Company("Company");
$t1 = new TechDep("TechDep1");
$t2 = new TechDep("TechDep2");
$c->add($t1);
$c->add($t2);
$c->show();