互联网公司流行扁平化管理,即管理层次要少于或不超过三层。作为一个底层码农,你的CEO和你的rank在3层以内。但是,很多传统企业的层级关系非常深。从数据结构的角度来看,这种按功能分组的组织结构非常类似于一棵树。我们今天介绍的组合模式的功能和这个企业组织结构层级的模式非常相似。Gof类图及说明GoF定义:将对象组合成树状结构,表示“部分-整体”的层次结构。Composite使用户能够使用具有一致性的单个对象和复合对象GoF类图代码实现abstractclassComponent{protected$name;公共函数__construct($name){$this->name=$name;}抽象公共函数操作(int$depth);抽象公共函数Add(Component$component);abstractpublicfunctionRemove(Component$component);}抽象的组件节点声明,在适当的情况下,实现所有类的公共接口的默认行为是所有子节点的父类。类Composite扩展了Component{private$componentList;publicfunctionOperation($depth){echostr_repeat('-',$depth).$这个->名字。PHP_EOL;foreach($this->componentListas$component){$component->Operation($depth+2);}}publicfunctionAdd(Component$component){$this->componentList[]=$component;}publicfunctionRemove(Component$component){$position=0;foreach($this->componentListas$child){++$position;如果($child==$component){array_splice($this->componentList,($position),1);}}}publicfunctionGetChild(int$i){return$this->componentList[$i];}}具体的节点实现类,保存了从属节点的引用,定义了实际的节点行为。classLeafextendsComponent{publicfunctionAdd(Component$c){echo'Cannotaddtoaleaf'.PHP_EOL;}publicfunctionRemove(Component$c){echo'无法从叶中删除'.PHP_EOL;(int$depth){echostr_repeat('-',$depth).$这个->名字。PHP_EOL;}}叶节点,最后一个没有孩子的节点。从代码来看,完全是一个树的实现。所有的子节点和叶子节点都可以处理数据,但是叶子节点是终点。你希望用户可以忽略组合对象和单个对象的区别,统一使用所有的组合结构。在处理对象时,应该考虑使用复合模式。用户不需要关心自己处理的是叶子节点还是组合组件,所以不需要写一些选择判断语句来定义组合。复合模式让客户可以使用复合结构和单一对象按照文章开头的例子,在我们的组织结构中,当一个任务到达最底层的人员时,会经过多个层级。我还是比较喜欢传统的企业管理方式。通常情况下,一个总监对应多个主管,一个主管对应多个经理,一个经理对应多个组长,一个组长对应多个员工。通知发出后,各级人员必须作出回应,并继续将通知下发给下属员工,同时征求下属的反馈意见。就这样,我们在不知不觉中完成了一种组合模式在实践中的应用。顿时感觉好极了,感觉自己的人生达到了巅峰!!完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/14.composite/source/composite.php示例短信,我们可以反复使用这个功能。这次也不例外。这次我们网站后台的功能是给不同分站不同来源的用户发送短信。在这里,我们仍然只关注发送短信。我们希望为您提供具有不同渠道角色但具有统一行为的用户。你只需要发送它。这样的功能看起来并不难!短信发送类图完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/14.composite/source/composite-msg.phpname=$name;}抽象公共函数Add(Role$role);抽象公共函数Remove(Role$role);abstractpublicfunctionSendMessage();}classRoleMangerextendsRole{publicfunctionAdd(Role$role){$this->userRoleList[]=$role;}publicfunctionRemove(Role$role){$position=0;foreach($this->userRoleListas$n){++$position;如果($n==$role){array_splice($this->userRoleList,($position),1);}}}publicfunctionSendMessage(){echo"开始发送用户角色:".$这个->名称。'下的所有用户短信',PHP_EOL;foreach($this->userRoleListas$role){$role->SendMessage();}}}classTeamextendsRole{publicfunctionAdd(Role$role){echo"群组用户不能添加下属!",PHP_EOL;}publicfunctionRemove(Role$role){echo"群组用户没有可删除的下属!",PHP_EOL;}publicfunctionSendMessage(){echo"Groupuserrole:".$这个->名字。'短信已发送!',PHP_EOL;}}//根用户$root=newRoleManger('网站用户');$root->add(newTeam('主站用户'));$root->SendMessage();//社交论坛$root2=newRoleManger('社交论坛');$managerA=newRoleManger('论坛用户');$managerA->add(newTeam('北京论坛用户'));$managerA->add(newTeam('上海论坛用户')user'));$managerB=newRoleManger('sns用户');$managerB->add(newTeam('北京sns用户'));$managerB->add(newTeam('上海sns用户'));$root2->add($managerA);$root2->add($managerB);$root2->SendMessage();说明一下,当我要发送论坛版块的用户时,我可以自由添加每个本地站的叶子节点来控制发送对象。可以把整个$root2的发送看成一个整体,不同的section和region看成是part。这种组合可以向下延伸,直到深叶节点结束。这个度数当然是自己把控的,很清楚下期的组合模式是最好的最大的特点是它允许叶子节点或子节点的无限组合和扩展,形成各种组合,但也能保证所有变化保持不变。让整个递归都在一个可控的范围内进行,厉害了!!下一篇我们要学习的是中介模型。它和我们经常打交道的房产中介有什么区别?别着急,我们下次再说!各媒体平台均可搜索【硬核项目经理】
