原理:把一组相似的对象当做一个单一的对象,为的是减少数据类型(分成分级,树形菜单)
demo:
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;
/*
* 组合模式
*/
public class CombinationMode {
//测试
public static void main(String[] args) {
DistrictNode root = new DistrictNode("根"); //根节点
root.addChild(new DistrictNode("上海")); //一级目录
root.addChild(new DistrictNode("天津")); //一级目录
DistrictNode districtNode = new DistrictNode("北京");
root.addChild(districtNode); //一级目录
districtNode.addChild(new DistrictNode("海淀区")); //二级目录
districtNode.addChild(new DistrictNode("大兴区")); //二级目录
DistrictNode districtNode2 = new DistrictNode("朝阳区"); //二级目录
districtNode.addChild(districtNode2);
// districtNode2.addChild(new DistrictNode("三里屯")); //三级目录
// districtNode2.addChild(new DistrictNode("朝阳外街")); //三级目录
districtNode2.addChild(new LeafNode("三里屯")); //叶子结点
districtNode2.addChild(new LeafNode("朝阳外街")); //叶子结点
System.out.println(JSON.toJSON(root));
}
}
abstract class Node{ //抽象结点
private String name;
public Node(String name){
this.name = name;
}
public abstract List<Node> getChildren(); //子结点
public String getName(){
return name;
}
}
class DistrictNode extends Node{ //结点
public DistrictNode(String name) {
super(name);
}
private List<Node> children = new ArrayList<Node>();
@Override
public List<Node> getChildren() {
return children;
}
public void addChild(Node node){
children.add(node);
}
public void delChild(int i){
children.remove(i);
}
}
class LeafNode extends Node{ //叶子结点
public LeafNode(String name){
super(name);
}
@Override
public List<Node> getChildren() {
return null;
}
}