组合模式 - 设计模式 - PHP版
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组合模式 - 设计模式 - PHP版相关的知识,希望对你有一定的参考价值。
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版的主要内容,如果未能解决你的问题,请参考以下文章