组合模式:又叫做部分整体模式。它是将一些具有从属关系的对象组合在一起形成树型结构,该结构中只有两种类型的对象,分别是容器节点(Composite)和叶子节点(leaf)。
容器节点是指树型结构中存在子节点的节点,它的子节点可以是容器节点,也可以是叶子节点。
叶子节点是指树型结构中不存在子节点的节点,它位于树型结构的末端。
其它系统对整个树型结构的所有对象的使用具有一致性。无论是容器节点还是叶子节点。
/**
* 节点,外部系统使用时都使用Node进行处理,实现了叶子节点和容器节点的一致性
* */
public interface Node {
//获取节点名称
public void getName();
}
/**
* 容器节点
* */
public class CompositeNode implements Node{
public String name;
public CompositeNode(String name){
this.name = name;
}
@Override
public void getName() {
System.out.println(name);
}
//存放容器节点的子节点,可以是容器节点,也可以是叶子节点,保证了节点的一致性
public ArrayList<Node> nodes = new ArrayList<>();
//添加子节点到树下
public void addNode(Node node){
nodes.add(node);
}
}
/**
* 叶子节点
* */
public class LeafNode implements Node{
String name;
public LeafNode(String name){
this.name = name;
}
@Override
public void getName() {
System.out.println(name);
}
}
public class Main {
public static void main(String[] args) {
Node root =getNodes();
getAllNodes(root,0);
}
//遍历
public static void getAllNodes(Node node,int dept){
for(int i =0;i<dept;i++){
System.out.print("--");
}
node.getName();
if(node instanceof CompositeNode){
for(Node n:((CompositeNode) node).nodes){
getAllNodes(n,dept+1);
}
}
}
//组装树
public static Node getNodes(){
CompositeNode root = new CompositeNode("Boss");
CompositeNode manager1 = new CompositeNode("Manager1");
root.addNode(manager1);
CompositeNode manager2 = new CompositeNode("Manager2");
root.addNode(manager2);
CompositeNode manager3 = new CompositeNode("Manager3");
root.addNode(manager3);
CompositeNode groupLeader1 = new CompositeNode("groupLeader1");
manager1.addNode(groupLeader1);
CompositeNode groupLeader2 = new CompositeNode("groupLeader2");
manager1.addNode(groupLeader2);
CompositeNode groupLeader3 = new CompositeNode("groupLeader3");
manager2.addNode(groupLeader3);
CompositeNode groupLeader4 = new CompositeNode("groupLeader4");
manager2.addNode(groupLeader4);
CompositeNode groupLeader5 = new CompositeNode("groupLeader5");
manager3.addNode(groupLeader5);
CompositeNode groupLeader6 = new CompositeNode("groupLeader6");
manager3.addNode(groupLeader6);
LeafNode NormalEmployee1 = new LeafNode("NormalEmployee1");
groupLeader1.addNode(NormalEmployee1);
LeafNode NormalEmployee2 = new LeafNode("NormalEmployee2");
groupLeader1.addNode(NormalEmployee2);
LeafNode NormalEmployee3 = new LeafNode("NormalEmployee3");
groupLeader2.addNode(NormalEmployee3);
LeafNode NormalEmployee4 = new LeafNode("NormalEmployee4");
groupLeader2.addNode(NormalEmployee4);
LeafNode NormalEmployee5 = new LeafNode("NormalEmployee5");
groupLeader3.addNode(NormalEmployee5);
LeafNode NormalEmployee6 = new LeafNode("NormalEmployee6");
groupLeader3.addNode(NormalEmployee6);
return root;
}
}