当前位置: 首页 > 后端技术 > Java

复合模式

时间:2023-04-01 19:13:05 Java

将对象组合成树状结构来表示层次结构的整个部分,复合模式允许用户统一对待单个对象和对象组合。组合模式一般可以分为三个角色抽象组件:定义需要实现的统一操作组合节点:一个复合对象,可以包含多个对象,也就是说它下面可能还有其他组合节点和叶子节点叶子节点:下面不存在其他节点(与组合点的唯一区别是没有子节点)。最常用的组合方式是表示一些树状结构的对象关系,比如部门或员工之间的上下级关系。下面以员工-下属关系为例,实现一个复合模式的抽象组件,定义了节点的一些公共属性和方法。公共抽象类AbstractNode{私有字符串名称;私有AbstractNode父节点;publicAbstractNode(Stringname){this.name=name;}publicAbstractNodegetParent(){返回父节点;}publicvoidsetParent(AbstractNodeparent){this.parent=parent;}publicStringgetName(){返回名称;}publicabstractvoidaddChild(AbstractNodenode);getChild(inti);publicabstractvoidremoveChild(inti);/***员工自我介绍*/publicabstractvoidintroduce();/***团队统计*/publicabstractintteamCount();在领导层,一些员工将在他们的管理之下publicclassNodeextendsAbstractNode{privateListnodes;公共节点(字符串名称){超级(名称);nodes=newArrayList<>();}@OverridepublicvoidaddChild(AbstractNodenode){node.setParent(this);节点。添加(节点);}@OverridepublicAbstractNodegetChild(inti){returnnodes.get(i);}@OverridepublicvoidremoveChild(inti){nodes.remove(i);}@Overridepublicvoidintroduce(){StringparentName=getParent()==null?"null":getParent().getName();System.out.println("我是"+getName()+",我的父母是"+parentName+",我有"+nodes.size()+"个孩子。");for(AbstractNodenode:nodes){node.introduce();}}@OverridepublicintteamCount(){intcount=0;for(AbstractNodenode:nodes){count+=node.teamCount();}返回计数+1;}}叶子节点,相对于底层员工,它们相对于组合节点更简单publicclassLeafextendsAbstractNode{publicLeaf(Stringname){super(name);}@OverridepublicvoidaddChild(AbstractNodenode){thrownewRuntimeException("这是一个叶节点");}@OverridepublicAbstractNodegetChild(inti){thrownewRuntimeException("这是一个叶节点");}@OverridepublicvoidremoveChild(inti){thrownewRuntimeException("这是叶节点");}@Overridepublicvoidintroduce(){System.out.println("我是"+getName()+",我的父节点是"+getParent().getName()+"。");}@OverridepublicintteamCount(){return1;}}clientcallpublicclassClient{publicstaticvoidmain(String[]args){AbstractNodehead=newNode("bigleader");AbstractNodemidA=newNode("小领导A");AbstractNodemidB=newNode("小领导B");AbstractNodestaff1=newLeaf("Staff-1");AbstractNodestaff2=newLeaf("Staff-2");AbstractNodestaff3=newLeaf("employee-3");head.addChild(midA);head.addChild(midB);midA.addChild(staff1);midA.addChild(staff2);midB.addChild(staff3);head.introduce();System.out.println(head.getName()+"总领导"+head.teamCount()+"人员");System.out.println(midA.getName()+"总领队"+midA.teamCount()+"人数");}}==========结果==========我是大领导,我的父母是空的,我有2个孩子。我是小领导A,我的父母是大领导,我有2个孩子。我是员工1,我的父母是小领导A。我是员工2,我的父母是小领导A。我是小领导B,我的父母是大领导,我有1个孩子。我是员工3,myparent是小leaderB.bigleader一共带领6个人smallleaderA带领3个人的组合该模式的主要目的是通过对象之间的组合关系将一组对象看成一个整体,并在其中进行操作统一的方式。