例子
將下圖關係表示出來
public abstract class Corp {
private String name=""; //每個人都有名字
private String position=""; //每個人都有職位
private int salary=0; //每個人都有薪水
public Corp(String _name,String _position,int _salary){
this.name=_name;
this.position=_position;
this.salary=_salary;
}
public String getInfo(){
String info="";
info="姓名:"+this.name+"\t 薪水:"+this.salary+"\t 職位:"+this.position;
return info;
}
}
將根節點當做樹枝節點
public class Branch extends Corp {
ArrayList<Corp> subordinateList=new ArrayList<Corp>();
public Branch(String _name, String _position, int _salary) {
super(_name, _position, _salary);
}
/**
* 添加一個下屬,可能是個小頭目,也有可能是個小兵
* @param corp
*/
public void addSubordinate(Corp corp){
this.subordinateList.add(corp);
}
/**
*我有哪些下屬
* @return
*/
public ArrayList<Corp> getSubordinate(){
return this.subordinateList;
}
}
public class Leaf extends Corp {
public Leaf(String _name, String _position, int _salary) {
super(_name, _position, _salary);
}
}
public class Client {
public static void main(String[] args) {
Branch ceo=compositeCorpTree();
System.out.println("CEO信息:"+ceo.getInfo());
getTreeInfo(ceo);
}
/**
* 準備數據
* @return
*/
public static Branch compositeCorpTree(){
Branch root=new Branch("劉大麻子","總經理",10000);
Branch developDep = new Branch("劉大瘸子","研發部門經理",10000);
Branch salesDep = new Branch("馬二柺子","銷售部門經理",20000);
Branch financeDep = new Branch("趙三駝子","財務部經理",30000);
//再把三個小組長產生出來
Branch firstDevGroup = new Branch("楊三乜斜","開發一組組長",5000);
Branch secondDevGroup = new Branch("吳大棒槌","開發二組組長",6000);
//把所有的小兵都產生出來
Leaf a = new Leaf("a","開發人員",2000);
Leaf b = new Leaf("b","開發人員",2000);
Leaf c = new Leaf("c","開發人員",2000);
Leaf d = new Leaf("d","開發人員",2000);
Leaf e = new Leaf("e","開發人員",2000);
Leaf f = new Leaf("f","開發人員",2000);
Leaf g = new Leaf("g","開發人員",2000);
Leaf h = new Leaf("h","銷售人員",5000);
Leaf i = new Leaf("i","銷售人員",4000);
Leaf j = new Leaf("j","財務人員",5000);
Leaf k = new Leaf("k","CEO祕書",8000);
Leaf zhengLaoLiu = new Leaf("鄭老六","研發部副經理",20000);
//開始組裝
//CEO下有三個部門經理和一個祕書
root.addSubordinate(k);
root.addSubordinate(developDep);
root.addSubordinate(salesDep);
root.addSubordinate(financeDep);
//研發部經理
developDep.addSubordinate(zhengLaoLiu);
developDep.addSubordinate(firstDevGroup);
developDep.addSubordinate(secondDevGroup);
//看看兩個開發小組下有什麼
firstDevGroup.addSubordinate(a);
firstDevGroup.addSubordinate(b);
firstDevGroup.addSubordinate(c);
secondDevGroup.addSubordinate(d);
secondDevGroup.addSubordinate(e);
secondDevGroup.addSubordinate(f);
//再看銷售部下的人員情況
salesDep.addSubordinate(h);
salesDep.addSubordinate(i);
//最後一個財務
financeDep.addSubordinate(j);
return root;
}
/**
*遍歷所有節點
* @param root
* @return
*/
public static void getTreeInfo(Branch root){
ArrayList<Corp> list= root.getSubordinate();
if(list!=null){
for(Corp c:list){
if(c instanceof Leaf){
System.out.println(c.getInfo());
}else{
System.out.println(root.getInfo());
getTreeInfo((Branch) c);
}
}
}
}
}
運行結果
CEO信息:姓名:劉大麻子 薪水:10000 職位:總經理
姓名:k 薪水:8000 職位:CEO祕書
姓名:劉大麻子 薪水:10000 職位:總經理
姓名:鄭老六 薪水:20000 職位:研發部副經理
姓名:劉大瘸子 薪水:10000 職位:研發部門經理
姓名:a 薪水:2000 職位:開發人員
姓名:b 薪水:2000 職位:開發人員
姓名:c 薪水:2000 職位:開發人員
姓名:劉大瘸子 薪水:10000 職位:研發部門經理
姓名:d 薪水:2000 職位:開發人員
姓名:e 薪水:2000 職位:開發人員
姓名:f 薪水:2000 職位:開發人員
姓名:劉大麻子 薪水:10000 職位:總經理
姓名:h 薪水:5000 職位:銷售人員
姓名:i 薪水:4000 職位:銷售人員
姓名:劉大麻子 薪水:10000 職位:總經理
姓名:j 薪水:5000 職位:財務人員