?1 <?php ?2 /* ?3 ?* 组合模式 ?4 ?* ??5 ?* 参考:http://www.cnblogs.com/praglody/p/6783317.html ?6 ?* ??7 ?*/ ?8 /** ?9 ?* 组合模式抽象基类 10 ?*/ 11 abstract class CompanyBase { 12 ????//节点名称 13 ????protected $name; 14 ????public function __construct($name) { 15 ????????$this->name = $name; 16 ????} 17 ????public function getName() { 18 ????????return $this->name; 19 ????} 20 ????//增加节点 21 ????abstract function add(CompanyBase $c); 22 ????//删除节点 23 ????abstract function remove(CompanyBase $c); 24 ????//输出节点信息 25 ????abstract function show($deep); 26 ????//节点职责 27 ????abstract function work($deep); 28 } 29 /** 30 ?* 公司类 31 ?*/ 32 class Company extends CompanyBase { 33 ????protected $item = []; 34 ????public function add(CompanyBase $c) { 35 ????????$nodeName = $c->getName(); 36 ????????if (!isset($this->item[$nodeName])) { 37 ????????????$this->item[$nodeName] = $c; 38 ????????} else { 39 ????????????throw new Exception("该节点已存在,节点名称:" . $nodeName); 40 ????????} 41 ????} 42 ????public function remove(CompanyBase $c) { 43 ????????$nodeName = $c->getName(); 44 ????????if (isset($this->item[$nodeName])) { 45 ????????????unset($this->item[$nodeName]); 46 ????????} else { 47 ????????????throw new Exception("该节点不存在,节点名称:" . $nodeName); 48 ????????} 49 ????} 50 ????public function show($deep = 0) { 51 ????????echo str_repeat("-", $deep) . $this->name; 52 ????????echo "<br>"; 53 ????????foreach ($this->item as $value) { 54 ????????????$value->show($deep + 4); 55 ????????} 56 ????} 57 ????public function work($deep = 0) { 58 ????????foreach ($this->item as $value) { 59 ????????????echo str_repeat(" ", $deep) . "[{$this->name}]<br>"; 60 ????????????$value->work($deep + 2); 61 ????????} 62 ????} 63 } 64 /** 65 ?* 人力资源部门 66 ?*/ 67 class HumanResources extends CompanyBase { 68 ????public function add(CompanyBase $c) { 69 ????????throw new Exception("该节点下不能增加节点"); 70 ????} 71 ????public function remove(CompanyBase $c) { 72 ????????throw new Exception("该节点下无子节点"); 73 ????} 74 ????public function show($deep = 0) { 75 ????????echo str_repeat("-", $deep) . $this->name; 76 ????????echo "<br>"; 77 ????} 78 ????public function work($deep = 0) { 79 ????????echo str_repeat(" ", $deep) . "人力资源部门的工作是为公司招聘人才"; 80 ????????echo "<br>"; 81 ????} 82 } 83 /** 84 ?* 商务部门 85 ?*/ 86 class Commerce extends CompanyBase { 87 ????public function add(CompanyBase $c) { 88 ????????throw new Exception("该节点下不能增加节点"); 89 ????} 90 ????public function remove(CompanyBase $c) { 91 ????????throw new Exception("该节点下无子节点"); 92 ????} 93 ????public function show($deep = 0) { 94 ????????echo str_repeat("-", $deep) . $this->name; 95 ????????echo "<br>"; 96 ????} 97 ????public function work($deep = 0) { 98 ????????echo str_repeat(" ", $deep) . "商务部门的工作是为公司赚取利润"; 99 ????????echo "<br>";100 ????}101 }102 //-------------------------测试代码------------------------ ?103 $c = new Company("北京某科技公司");104 $h = new HumanResources("人力资源部门");105 $com = new Commerce("商务部门");106 $c->add($h);107 $c->add($com);108 //天津分公司109 //为了偷懒,分公司的部门直接copy母公司的110 $c1 = new Company("天津分公司");111 $c1->add($h);112 $c1->add($com);113 $c->add($c1);114 //武汉分公司115 $c2 = new Company("武汉分公司");116 $c2->add($h);117 $c2->add($com);118 $c->add($c2);119 //使用公司功能120 $c->show();121 $c->work();
组合模式 - 设计模式 - PHP版
原文地址:http://www.cnblogs.com/benben7466/p/7736566.html