组合模式 - 设计模式 - PHP版
2017-10-26 14:13
627 查看
<?php /* * 组合模式 * * 参考:http://www.cnblogs.com/praglody/p/6783317.html * */ /** * 组合模式抽象基类 */ 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();
相关文章推荐
- php 设计模式(组合模式一)
- PHP设计模式之组合模式
- [php] 设计模式之 组合模式
- [php]php设计模式 Composite (组合模式)
- PHP设计模式之组合模式
- Php设计模式之【组合模式Composite Pattern】
- PHP设计模式之组合(Composite)模式
- php设计模式 Composite (组合模式)
- php设计模式 Composite (组合模式)
- PHP设计模式——组合模式
- php设计模式 Composite (组合模式)
- PHP:设计模式之组合模式
- 初识PHP设计模式--组合模式
- PHP草根论之设计 模式-组合模式
- 深入理解PHP:高级技巧、面向对象与核心技术(原书第3版) -- 设计模式之组合模式
- php 3种基本设计模式的组合使用
- PHP设计模式之组合模式
- 设计模式之组合模式与PHP案例
- php实现设计模式之 组合模式
- PHP设计模式系列(十四):组合模式