設計模式_組合模式

Composite Pattern 
    Compose objects into tree structures to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly.(將對象組合成樹形結構以表示"部分-整體"的層次結構,使得用戶對單個對象和組合對象的使用具有一致性) 

不認識的單詞
hierarchies 等級,層次
uniformly 一致的,相同的

例子

 將下圖關係表示出來


分析
    樹,葉子節點,樹枝節點,根節點,三者都要有一個getInfo()方法,三者都有姓名,職位,薪水,這些信息暫且通過構造函數傳進來。 
    不同點:葉子節點不能添加子節點,而樹枝節點和根節點可以,而且這倆個類還必須有一個集合來存下面的子節點對象。

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	 職位:財務人員


看完之後,覺得,這個東西特點性太強,用在其他地方還真不行。使人一看到類似的問題就會想到這個模式。  簡單來說就是提煉相同的地方,抽取成一個抽象類,至於後面都是依葫蘆畫瓢了。 

優點 
    調用簡單
    節點增加自由,非常容易擴展,還可以寫刪除節點,修改等等操作,好像數據結構了

我是菜鳥,我在路上。

發佈了78 篇原創文章 · 獲贊 17 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章