23种设计模式 之组合模式
一、定义
 将对象组合成树形结构以表示“部分--整体”的层次结构,使得用户对单个对象和组合的使用具有一致性。
二、优点
高层模块调用简单,子节点增加方便
三、故事开始(代码示例)
李实名要开餐馆,地点和房子都选好了,可是人手还不够,于是李实名开始着手寻揽着一些好的下属,经过几天的寻找,人手终于被他全部找到了,分别是曹草,空明,紫龙,允常,黑子这几名得力干将,当然还有一些普通员工:
人是找好了但是职位安排呢,于是他需要一番设计:
首先是 员工基本信息 把它抽象乘一个类
 
03 | 
public abstract class Corp  | 
 
06 | 
    private String nameString;  | 
 
08 | 
    private String zhiweiString;  | 
 
11 | 
    private double xinshui;  | 
 
13 | 
    public Corp(String nameString, String zhiweiString, double xinshui)  | 
 
15 | 
        this.nameString = nameString;  | 
 
16 | 
        this.zhiweiString = zhiweiString;  | 
 
17 | 
        this.xinshui = xinshui;  | 
 
20 | 
    public String getXinXi()  | 
 
22 | 
        String xinxi = "员工:"+this.nameString+"\t职位:"+zhiweiString+"\t薪水:"+xinshui;  | 
 
 
 
 
接着是树叶节点,指那些没有下属的人
3 | 
public class Leaf extends Corp  | 
 
5 | 
    public Leaf(String nameString, String zhiweiString, double xinshui)  | 
 
7 | 
        super(nameString, zhiweiString, xinshui);  | 
 
 
 
 
再下来就是树枝节点,也就是有下属的人,包括根节点(boss)
02 | 
import java.util.ArrayList;  | 
 
03 | 
public class Branch extends Corp  | 
 
06 | 
    ArrayList<Corp> arrayList = new ArrayList<Corp>();  | 
 
08 | 
    public Branch(String nameString, String zhiweiString, double xinshui)  | 
 
10 | 
        super(nameString, zhiweiString, xinshui);  | 
 
13 | 
    public void add(Corp c)  | 
 
17 | 
    public ArrayList<Corp> getCorps()  | 
 
19 | 
        return this.arrayList;  | 
 
 
 
 
最后是场景类
02 | 
import java.util.ArrayList;  | 
 
06 | 
    private static Branch zuHe()  | 
 
08 | 
        Branch boss = new Branch("李实名", "BOSS", 0.0);  | 
 
09 | 
        Branch guanliBranch = new Branch("空明", "CEO", 11000.0);  | 
 
10 | 
        Branch xiaoshouBranch = new Branch("曹草", "销售总监", 15000.0);  | 
 
11 | 
        Branch tejichushi = new Branch("黑子", "特级厨师", 10000.0);  | 
 
12 | 
        Leaf aLeaf = new Leaf("紫龙", "CEO秘书", 6000);  | 
 
13 | 
        Leaf bLeaf = new Leaf("允常", "销售经理", 6500);  | 
 
14 | 
        Leaf cLeaf = new Leaf("某A", "一级厨师", 5000);  | 
 
16 | 
        boss.add(guanliBranch);  | 
 
17 | 
        boss.add(xiaoshouBranch);  | 
 
20 | 
        guanliBranch.add(aLeaf);  | 
 
21 | 
        xiaoshouBranch.add(bLeaf);  | 
 
22 | 
        tejichushi.add(cLeaf);  | 
 
27 | 
    private static String getTree(Branch boss)  | 
 
29 | 
        ArrayList<Corp> arrayList = boss.getCorps();  | 
 
31 | 
        for (Corp corp : arrayList)  | 
 
33 | 
            if (corp instanceof Leaf)   | 
 
35 | 
                xinxi = xinxi+corp.getXinXi()+"\n";   | 
 
39 | 
                xinxi = xinxi+corp.getXinXi()+"\n"+getTree((Branch)corp);  | 
 
45 | 
    public static void main(String[] args)  | 
 
48 | 
        System.out.println(boss.getXinXi());  | 
 
49 | 
        System.out.println(getTree(boss));  | 
 
 
 
 
好了,程序跑一遍:
员工:李实名	    	职位:BOSS	         薪水:0.0
员工:空明	职位:CEO	 	         薪水:11000.0
员工:紫龙	 	职位:CEO秘书  	    薪水:6000.0
员工:曹草	 	职位:销售总监  	薪水:15000.0
员工:允常	  	职位:销售经理	 	 薪水:6500.0
员工:黑子	  	职位:特级厨师	  	 薪水:10000.0
员工:某A	  	职位:一级厨师	     薪水:5000.0
OK,整个饭馆的结构好了,接下来就是经营方面的问题了,做什么菜呢?这可是个苦恼的问题,唉,算了明天再想吧!!!!