深入认识PHP中的组合模式
发布时间:2022-07-12 13:00:07 所属栏目:PHP教程 来源:互联网
导读:互联网公司流行扁平化管理,也就是管理层级尽量少于或者不超过三层,作为一个底层的码农,你的CEO和你的职级也就相差3层以内。但是很多传统企业,则会有非常深的层级关系,从数据结构看,这种按职能进行分组的组织架构非常像一颗树。而我们今天介绍的组合模
互联网公司流行扁平化管理,也就是管理层级尽量少于或者不超过三层,作为一个底层的码农,你的CEO和你的职级也就相差3层以内。但是很多传统企业,则会有非常深的层级关系,从数据结构看,这种按职能进行分组的组织架构非常像一颗树。而我们今天介绍的组合模式的作用就和这个企业组织架构层级的模式非常类似。 Gof类图及解释 GoF定义:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性 GoF类图 1.png 代码实现 abstract class Component { protected $name; public function __construct($name){ $this->name = $name; } abstract public function Operation(int $depth); abstract public function Add(Component $component); abstract public function Remove(Component $component); } 抽象出来的组合节点声明,在适当情况下实现所有类的公共接口的缺省行为,是所有子节点的父类。 class Composite extends Component { private $componentList; public function Operation($depth) { echo str_repeat('-', $depth) . $this->name . PHP_EOL; foreach ($this->componentList as $component) { $component->Operation($depth + 2); } } public function Add(Component $component) { $this->componentList[] = $component; } public function Remove(Component $component) { $position = 0; foreach ($this->componentList as $child) { ++$position; if ($child == $component) { array_splice($this->componentList, ($position), 1); } } } public function GetChild(int $i) { return $this->componentList[$i]; } } 具体的节点实现类,保存下级节点的引用,定义实际的节点行为。 class Leaf extends Component { public function Add(Component $c) { echo 'Cannot add to a leaf' . PHP_EOL; } public function Remove(Component $c) { echo 'Cannot remove from a leaf' . PHP_EOL; } public function Operation(int $depth) { echo str_repeat('-', $depth) . $this->name . PHP_EOL; } } 叶子节点,没有子节点的最终节点。 从来代码来看,完全就是一颗树的实现 所有的子节点和叶子节点都可以处理数据,但叶子节点为终点 你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式 用户不用关心到底是处理一个叶节点还是处理一个组合组件 ,也就用不着为定义组合而写一些选择判断语句了 组合模式可以让客户一致性地使用组合结构和单个对象 接着文章最开头的例子来说,在我们的组织架构中,一项任务下达到最底的人员时,会经历多个层级。我还是比较喜欢传统一起的企业管理方式。通常是一名总监对应多个主管,一名主管对应多位经理,一位经理对应多位组长,一名组长对应多名员工。当一个通知下发时,每一层级的工作人员都要做出回应,并将通知继续下发到下属员工那里,同时从下属哪里获得反馈。这样,我们就不知不觉地在实践中完成了一次组合模式的应用。突然感觉自己棒棒哒,感觉人生已经到达了巅峰!! (编辑:开发网_郴州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |