23种设计模式 之组合模式

一、定义

 将对象组合成树形结构以表示“部分--整体”的层次结构,使得用户对单个对象和组合的使用具有一致性。

二、优点

高层模块调用简单,子节点增加方便

三、故事开始(代码示例)

李实名要开餐馆,地点和房子都选好了,可是人手还不够,于是李实名开始着手寻揽着一些好的下属,经过几天的寻找,人手终于被他全部找到了,分别是曹草,空明,紫龙,允常,黑子这几名得力干将,当然还有一些普通员工:

人是找好了但是职位安排呢,于是他需要一番设计:

首先是 员工基本信息 把它抽象乘一个类

 
01 package zuhe; 
02 //抽象的员工类 
03 public abstract class Corp 
04
05     //姓名 
06     private String nameString; 
07     //职位 
08     private String zhiweiString; 
09        
10     //薪水 
11     private double xinshui; 
12        
13     public Corp(String nameString, String zhiweiString, double xinshui) 
14     
15         this.nameString = nameString; 
16         this.zhiweiString = zhiweiString; 
17         this.xinshui = xinshui; 
18     
19     //员工信息 
20     public String getXinXi() 
21     
22         String xinxi = "员工:"+this.nameString+"\t职位:"+zhiweiString+"\t薪水:"+xinshui; 
23         return xinxi; 
24     
25

接着是树叶节点,指那些没有下属的人

1 package zuhe; 
2 //叶子节点的实现类 
3 public class Leaf extends Corp 
4
5     public Leaf(String nameString, String zhiweiString, double xinshui) 
6     
7         super(nameString, zhiweiString, xinshui); 
8     
9

再下来就是树枝节点,也就是有下属的人,包括根节点(boss)

01 package zuhe; 
02 import java.util.ArrayList; 
03 public class Branch extends Corp 
04
05     //此人的下级 
06     ArrayList<Corp> arrayList = new ArrayList<Corp>(); 
07        
08     public Branch(String nameString, String zhiweiString, double xinshui) 
09     
10         super(nameString, zhiweiString, xinshui); 
11     
12     //添加下属 
13     public void add(Corp c) 
14     
15         arrayList.add(c); 
16     
17     public ArrayList<Corp> getCorps() 
18     
19         return this.arrayList; 
20     
21

最后是场景类

01 package zuhe; 
02 import java.util.ArrayList; 
03 public class Client 
04
05     //组合所有员工 
06     private static Branch zuHe() 
07     
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); 
15            
16         boss.add(guanliBranch); 
17         boss.add(xiaoshouBranch); 
18         boss.add(tejichushi); 
19            
20         guanliBranch.add(aLeaf); 
21         xiaoshouBranch.add(bLeaf); 
22         tejichushi.add(cLeaf); 
23            
24         return boss; 
25     
26        
27     private static String getTree(Branch boss) 
28     
29         ArrayList<Corp> arrayList = boss.getCorps(); 
30         String xinxi =""
31         for (Corp corp : arrayList) 
32         
33             if (corp instanceof Leaf)  
34             
35                 xinxi = xinxi+corp.getXinXi()+"\n";  
36             }  
37             else  
38             
39                 xinxi = xinxi+corp.getXinXi()+"\n"+getTree((Branch)corp); 
40                    
41             
42         
43         return xinxi; 
44     
45     public static void main(String[] args) 
46     
47         Branch boss = zuHe(); 
48         System.out.println(boss.getXinXi()); 
49         System.out.println(getTree(boss)); 
50     
51

好了,程序跑一遍:

员工:李实名      职位:BOSS          薪水:0.0

员工:空明 职位:CEO            薪水:11000.0

员工:紫龙   职位:CEO秘书       薪水:6000.0

员工:曹草   职位:销售总监   薪水:15000.0

员工:允常    职位:销售经理    薪水:6500.0

员工:黑子    职位:特级厨师     薪水:10000.0

员工:某A    职位:一级厨师      薪水:5000.0

OK,整个饭馆的结构好了,接下来就是经营方面的问题了,做什么菜呢?这可是个苦恼的问题,唉,算了明天再想吧!!!!

作者: saoba 发表于 2011-06-07 12:39 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架