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