**定义**:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
## 一般模式:
![](https://box.kancloud.cn/2016-06-06_5755340b878be.jpg)
Component抽象构件角色
--|定义参与组合对象的共有方法和属性,可以定义一些默认的行为或属性。
Leaf叶子构件
--|叶子对象,其下再也没有其他的分支,也是遍历的最小单位。
Composite树枝构件
--|树枝对象,他的作用是组合树枝节点和叶子节点形成一个树形结构。
~~~
public class CompositeTest {
public static void main(String[] args) {
//创建一个根节点
Composite root = new Composite();
root.doSomething();
//创建一个分支
Composite branch = new Composite();
//创建一个叶子节点
Leaf leaf = new Leaf();
//添加分支
root.add(branch);
//添加叶子
branch.add(leaf);
branch.add(leaf);
branch.add(leaf);
//遍历所有节点
display(root);
}
/**
* 从上到下遍历,所有节点
* @param root
*/
public static void display(Composite root){
for(Component c : root.getChildren()){
if(c instanceof Leaf){ //如果是叶子节点,就是从
c.doSomething();
}else{
//递归调用
display((Composite)c);
}
}
}
}
abstract class Component{
//抽象构件,参与组合构架的共有方法和属性
public void doSomething(){
System.out.println("执行共有的业务逻辑...");
}
}
/**
* 树枝构件,组合树枝节点和叶子节点,形成一个树形结构
* @author admin
*
*/
class Composite extends Component{
//构件容器
private ArrayList<Component> componentList = new ArrayList<Component>();
//增加一个叶子节点或树枝节点
public void add(Component component){
this.componentList.add(component);
}
//删除一个叶子节点或树枝节点
public void remove(Component component){
this.componentList.remove(component);
}
//遍历所有的节点
public ArrayList<Component> getChildren(){
return this.componentList;
}
}
/**
* 叶子节点,没有任何的分支
* @author admin
*
*/
class Leaf extends Component{
//重写父类的方法
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("叶子节点,执行方法....");
}
}
~~~
## 一个例子:
如图是公司员工的树形图,要求可以动态的添加员工和部门经理等。并且遍历输出。
1、抽取共有方法和属性作为抽象构件Corp。
2、定义树枝节点,提供添加节点方法和获取所有节点的方法CompanyBranch
3、定义叶子节点。CompanyLeaf
![](https://box.kancloud.cn/2016-06-06_5755340ba2c58.jpg)
UML类图
![](https://box.kancloud.cn/2016-06-06_5755340bbbc6c.jpg)
~~~
public class CompositeT {
public static void main(String[] args) {
CompanyBranch CEO = getBranch();
System.out.println(CEO.getInfo());
System.out.println(display(CEO));
}
public static CompanyBranch getBranch(){
//添加一个ceo
CompanyBranch CEO = new CompanyBranch("wb", "ceo", 10);
//添加一个财务经理
CompanyBranch FD = new CompanyBranch("xy", "财务经理", 10);
//添加一个销售经理
CompanyBranch XS = new CompanyBranch("ll", "销售经理", 10);
//添加一个技术总监
CompanyBranch CTO = new CompanyBranch("lzl", "技术总监", 10);
//添加财务人员
CompanyLeaf a = new CompanyLeaf("小A", "财务人员", 10);
//添加销售组长
CompanyBranch b = new CompanyBranch("小B", "销售组长", 10);
//添加销售组员
CompanyLeaf c = new CompanyLeaf("小C", "销售组员", 10);
//添加销售组员
CompanyLeaf e = new CompanyLeaf("小e", "销售组员", 10);
//添加技术组长
CompanyBranch f = new CompanyBranch("小f", "A项目组长", 10);
//添加技术组长
CompanyBranch g = new CompanyBranch("小g", "B项目组长", 10);
//项目组员
CompanyLeaf h = new CompanyLeaf("小h", "项目A组员", 10);
CompanyLeaf i = new CompanyLeaf("小i", "项目A组员", 10);
CompanyLeaf j = new CompanyLeaf("小j", "项目A组员", 10);
CompanyLeaf k = new CompanyLeaf("小k", "项目B组员", 10);
CompanyLeaf l = new CompanyLeaf("小l", "项目B组员", 10);
CompanyLeaf m = new CompanyLeaf("小m", "项目B组员", 10);
//经理小秘
CompanyLeaf n = new CompanyLeaf("小花", "经理秘书", 10);
//ceo下面是三大经理
CEO.addCorp(FD);
CEO.addCorp(CTO);
CEO.addCorp(XS);
CEO.addCorp(n);
//财务经理的手下
FD.addCorp(a);
//销售经理的手下
XS.addCorp(b);
//销售组长的手下
b.addCorp(c);
b.addCorp(e);
//CTO的手下
CTO.addCorp(f);
CTO.addCorp(g);
//项目组长的手下
f.addCorp(h);
f.addCorp(i);
f.addCorp(j);
g.addCorp(k);
g.addCorp(l);
g.addCorp(m);
return CEO;
}
public static String display(CompanyBranch corp){
String info = "";
for(Corp c : corp.getChildren()){
if(c instanceof CompanyLeaf){
info = info + c.getInfo();
}else{
info = info + c.getInfo()+display((CompanyBranch)c);
}
}
return info;
}
}
/**
* 抽象构件,提取共有方法和属性。
* @author admin
*
*/
abstract class Corp{
//每个员工都有姓名,薪水,职称
private String name;
private double salary;
private String position;
public Corp(String name,String position,double salary) {
this.name = name;
this.position = position;
this.salary = salary;
}
public String getInfo(){
return "姓名:"+this.name+"\t 职称:"+this.position+"\t薪水:"+this.salary+"\n";
}
}
/**
* 树枝构件,提供添加分支的方法和获取所有节点的方法。
* @author admin
*
*/
class CompanyBranch extends Corp{
//必须有一个私有集合存储
private ArrayList<Corp> corpList= new ArrayList<Corp>();
public CompanyBranch(String name, String position, double salary) {
super(name, position, salary);
}
//添加分支,树枝节点或者叶子节点
public void addCorp(Corp corp){
this.corpList.add(corp);
}
//获取集合。
public ArrayList<Corp> getChildren(){
return this.corpList;
}
}
/**
* 叶子节点,没有任何分支。
* @author admin
*
*/
class CompanyLeaf extends Corp{
public CompanyLeaf(String name, String position, double salary) {
super(name, position, salary);
}
}
~~~
组合模式不太理解,只能暂时这么总结了。。
- 前言
- 6大设计原则(一)---单一职责原则
- 6大设计原则(二)---里氏替换原则
- 6大设计原则(三)---依赖倒置原则
- 6大设计模式(四)----接口隔离原则
- 6大设计原则(五)---迪米特法则
- 6大设计原则(六)---开闭原则。
- 设计模式(一)---单例模式
- 设计模式(二)---工厂方法模式
- 设计模式(三)---抽象工厂模式
- 设计模式(四)---模板方法模式
- 设计模式(五)---建造者模式
- 设计模式(六)---代理模式
- 设计模式(七)---原型模式
- 设计模式(八)---中介者模式
- 设计模式(九)---命令模式
- 设计模式(十)---责任链模式
- 设计模式(十一)---装饰模式
- 设计模式(十二)---策略模式
- 设计模式(十三)---适配器模式
- 设计模式(十四)---迭代器模式
- 设计模式(十五)---组合模式
- 设计模式(十六)---观察者模式
- 设计模式(十七)---门面模式
- 设计模式(十八)---备忘录模式
- 设计模式(十八)---访问者模式
- 设计模式(二十)---状态模式
- 设计模式(二十二)---享元模式
- 设计模式(二十三)---桥梁模式