Component组合模式

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

角色:

  1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component 子部件。

  2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。

  3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。

使用情况

引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”

DEMO

public static void main(String[] args) {

        Component component=new Composite("根节点");
        Component child=new Composite("一级子节点child");
        Component child_1=new Leaf("一级子节点child之子节点一");
        Component child_2=new Leaf("一级子节点child之子节点二");
        child.add(child_1);
        child.add(child_2);
        Component child2=new Composite("一级子节点child2");
        component.add(child);
        component.add(child2);
        component.foreach();
    }

}
 abstract class Component {  

     String name;

     public Component(String s){

         this.name=s;
     }
     public abstract void add(Component c);
     public abstract void remove(Component c);
     public abstract void foreach();
 }
//组合类
 class Composite extends Component{
    private List<Component>child=new ArrayList<Component>
    ();

    public Composite(String s) {
        super(s);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void add(Component c) {
        child.add(c);

    }

    @Override
    public void foreach() {
        // TODO Auto-generated method stub
        System.out.println("节点名:\t"+name);
        for (Component c : child) {
            c.foreach();
        }
    }

    @Override
    public void remove(Component c) {
        // TODO Auto-generated method stub
        child.remove(c);
    }

 }
 //不在有根节点
 class Leaf extends Component{

    public Leaf(String s) {
        super(s);

    }

    @Override
    public void add(Component c) {
        // TODO Auto-generated method stub

    }
    @Override
    public void foreach() {
        System.out.println("tself name-->"+this.name);
    }

    @Override
    public void remove(Component c) {
        // TODO Auto-generated method stub

    }

 }  

执行结果:

节点名: 根节点
节点名:	一级子节点child
tself name-->一级子节点child之子节点一
tself name-->一级子节点child之子节点二
节点名:	一级子节点child2