用处:树结构,...
先上类图
组合模式.jpg
案例代码
先定义Node接口
package com.wwj.compositemode;
public interface Node {
abstract public void p();
}
定义叶子节点
package com.wwj.compositemode;
/***
* 叶子节点,无下一层,包含具体的内容
*/
public class LeafNode implements Node {
private String content;
public LeafNode(String content){
this.content=content;
}
@Override
public void p() {
System.out.println(content);
}
}
定义分支节点
package com.wwj.compositemode;
import java.util.ArrayList;
import java.util.List;
/**
* 分支节点,包含多个Node(可能是叶子节点也可能是分支节点)
*/
public class BranchNode implements Node {
private String name;
private List<Node> nodes = new ArrayList<>();
public BranchNode(String name){
this.name = name;
}
@Override
public void p() {
System.out.println(name);
}
public void addNodes(Node node){
this.nodes.add(node);
}
public List<Node> getNodes(){
return this.nodes;
}
public static void tree(Node node,int depth){
for (int i = 0; i <depth ; i++) {
System.out.print("--");
}
node.p();
if (node instanceof BranchNode){
BranchNode branchNode = (BranchNode)node;
for(Node n:branchNode.getNodes()){
tree(n,depth+1);
}
}
}
}
具体应用
package com.wwj.compositemode;
public class main {
public static void main(String[] args) {
//最顶级菜单
BranchNode root = new BranchNode("root");
//第二级菜单
BranchNode menuOne = new BranchNode("menuOne");
BranchNode menuTwo = new BranchNode("menuTwo");
BranchNode menuThree = new BranchNode("menuThree");
//第三集菜单(最后一级菜单)
LeafNode ln1 = new LeafNode("ln1");
LeafNode ln2 = new LeafNode("ln2");
LeafNode ln3 = new LeafNode("ln3");
LeafNode ln4 = new LeafNode("ln4");
//添加一级菜单
root.addNodes(menuOne);
root.addNodes(menuTwo);
root.addNodes(menuThree);
//添加二级菜单
menuOne.addNodes(ln1);
menuOne.addNodes(ln2);
menuTwo.addNodes(ln3);
menuTwo.addNodes(ln4);
//打印所有节点
BranchNode.tree(root,0);
}
}