(原创)认识设计模式-组合

2015/03/16 设计模式

介绍

img

组合的定义为:将对象组合成树形结构以表示部分和整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

这句话有两层意思:

  1. 树形结构:学过基本数据结构的都知道这个,也就是说组合模式必须先是树形结构。
  2. 具有一致性:意思就是树枝和树干必须提供一致接口,给用户的使用感觉就是无区分。

这么一看,组合模式就很简单,生后中的例子就很多了:家谱关系图,书本的目录,公司的组织结构等等,都是这个模式最好的实践例子。

使用方式

	public interface Component {
	
	    public void doSomething();
	
	}
	
	public class Leaf implements Component {
	
	    private String mName;
	
	    public Leaf(String name)
	    {
	        mName = name;
	    }
	
	    @Override
	    public void doSomething() {
	
	        System.out.println("Leaf"+mName+" doSomething");
	    }
	}
	
	public class Composite implements Component {
	
	    private List<Component> mComponents= new ArrayList<>();
	
	    @Override
	    public void doSomething() {
	
	        System.out.println("Composite doSomething\n{");
	        for(Component component:mComponents)
	        {
	            component.doSomething();
	        }
	        System.out.println("}");
	    }
	
	    public void addComponent(Component component)
	    {
	        mComponents.add(component);
	    }
	
	    public void removeComponent(Component component)
	    {
	        mComponents.remove(component);
	    }
	
	}
	
	public class Main {
	
	    private static List<Component> mComponent = new ArrayList<>();
	
	    public static void main(String[] args) throws Exception {
	
	        Leaf leaf1 = new Leaf("1");
	        Leaf leaf2 = new Leaf("2");
	        Leaf leaf3 = new Leaf("3");
	
	        Composite composite = new Composite();
	        composite.addComponent(leaf1);
	        composite.addComponent(leaf2);
	        composite.addComponent(leaf3);
	
	        mComponent.add(leaf1);
	        mComponent.add(leaf2);
	        mComponent.add(leaf3);
	        mComponent.add(composite);
	
	        for(Component component:mComponent)
	        {
	            component.doSomething();
	        }
	    }
	}

结果如下:

Leaf1 doSomething
Leaf2 doSomething
Leaf3 doSomething
Composite doSomething
{
Leaf1 doSomething
Leaf2 doSomething
Leaf3 doSomething
}

总结

以上代码中和定义有点区别,个人认为把addremove放到Composite更合适,毕竟只有Composite才有这两个业务。

Android源码中,ViewViewGroup就是典型的例子,不过和这标准的组合模式稍微有点区别,也就是取消了Component接口,直接让Composite继承Leaf类,来保证局部和整体具有一致性,在Composite类业务完全包含Leaf类业务的话这种写法既不违背模式定义,又使代码变得简洁,因此,模式的使用应该按照实际需求灵活运用。


知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

站内搜索

    撩我备注-博客

    joinee

    目录结构