定义:允许你将对象组合成树型结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理 个别对象 以及 对象组合。


角色:

1) 抽象构建角色 (Component)

2) 叶子节点角色 (Leaf)

3) 组合构建角色 (Composite)

4) 客户端 (Client)


Component.java


package com.composite ;

import java.util.List ;

//抽象构件角色
public interface Component

{
public void add (Component component) ;

public void remove (Component component) ;

public void doSomeThing () ;

public List<Component> getAll () ;

}




Leaf.java


package com.composite ; 

import java.util.List ;

//叶子角色
public class Leaf implements Component

{
public void add (Component component)
{

}
public void remove (Component component)
{

}

public List<Component> getAll ()
{
return null ;
}

public void doSomeThing ()
{

System.out.println("hello") ;

}

}



Composite.java


package com.composite ;

import java.util.List ;
import java.util.ArrayList ;

//组合角色
public class Composite implements Component

{
private List<Component> list = new ArrayList<Component> () ;

public void add (Component component)
{
list.add(component) ;
}

public void remove (Component component)
{

list.remove(component) ;

}

public List<Component> getAll ()
{
return this.list ;

}

//隐式递归 如果 遍历后发现component是叶子节点,则打印;反之,隐式递归

public void doSomeThing ()
{
for (Component component : list)
{
component.doSomeThing() ;

}

}


}



Client.java


package com.composite ;

//客户端角色
public class Client
{
public static void main(String[] args)
{
//创建两个叶子构件

Component leaf1 = new Leaf () ;

Component leaf2 = new Leaf () ;

//创建一个组合构件
Component com1 = new Composite () ;

com1.add (leaf1) ;

com1.add (leaf2) ;

//创建两个叶子构件
Component leaf3 = new Leaf () ;

Component leaf4 = new Leaf () ;

//创建一个组合构件
Component com2 = new Composite () ;

//把第一个组件装进第二个组件里
com2.add (com1) ;

com2.add (leaf3) ;

com2.add (leaf4) ;

com2.doSomeThing () ;

//com2.remove(com1) ;
//com2.remove(leaf2) ;//在这移除不掉leaf2,只能com1.remove(leaf2)
//System.out.println(com2.getAll()) ;

}


}


总结:

优点:

组合模式(Composite)可以让客户端的代码变的简单,不会那么繁琐,一致性的处理单个对象和组合对象

使用组合模式可以很好的增加新的叶子构件


缺点:

控制树枝节点构件不容易​