组合模式将一组相似的对象看做一个对象来处理,并且根据一个树状结构来组合对象。然后提供一个统一的方法去访问相应的对象。以此忽略掉对象与对象集合之间的差别。
定义:
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
使用场景:
表示对象的部分-整体层次结构时
从一个整体中能够独立出部分模块或功能的场景
实现,有两种组合模式:安全组合模式和透明组合模式
安全组合模式:
定义一个抽象根节点 Component,有一个抽象方法doSomething。
枝干对象Composite去继承Component,并且有一个成员变量List<Component>,还有addChild和removeChild,getChild方法。来往List中设置枝干/子叶节点(添加、删除、或者获取)。
当我们调用doSomething的时候,就去迭代List,然后调用每一个元素的doSomething方法。
根端的子叶对象leaf也是继承Component,但是他由于没有子节点,没有list,所以不用有addChild,getChild或者removeChild方法,只有一个doSomething方法,方法进行具体操作。
客户端创建枝干或者子叶对象,添加设置好树状结构后,调用rootObject.doSomething就能迭代调用到每一个对象的doSomething方法了。
透明组合模式
所有的方法都定义在抽象类Commponent中(addChild,removeChild,getChild方法),枝干节点的这些方法对List进行增删,子叶节点抛出异常。枝干节点和子叶节点拥有同样的结构。
Android中的组合模式
ViewGroup和View就是一个很经典的安全组合模式
ViewGroup是继承View的,同时又实现了接口ViewManager
ViewManager中有addView、removeView和updateViewLayout
显然构成了一个组合模式
优点:
1.可以清楚的定义分层次的复杂对象,表示对象的全部或部分层次
2.让高层的模块忽略了层次的差异,调用不用关心是当对象还是组合。
3.添加节点很方便,符合开闭原则。
缺点:
新增节点时不好对枝干中的结构类型进行限制,必须进行类型检查,实现起来较为复杂。