组合模式 - 设计模式 - 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("&emsp;", $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("&emsp;", $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("&emsp;", $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版的主要内容,如果未能解决你的问题,请参考以下文章

PHP设计模式之组合模式

PHP面向对象之访问者模式+组合模式

php PHP片段保存模式

设计模式这样玩泰简单(Golang版)-装饰者模式

php--观察者模式

PHP设计模式—组合模式