定义:允许你将对象组合成树型结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理 个别对象 以及 对象组合。
角色:
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)可以让客户端的代码变的简单,不会那么繁琐,一致性的处理单个对象和组合对象
使用组合模式可以很好的增加新的叶子构件
缺点:
控制树枝节点构件不容易