每日Android源码设计模式之-18、组合模式

组合模式将一组相似的对象看做一个对象来处理,并且根据一个树状结构来组合对象。然后提供一个统一的方法去访问相应的对象。以此忽略掉对象与对象集合之间的差别。


定义:

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


使用场景:

表示对象的部分-整体层次结构时

从一个整体中能够独立出部分模块或功能的场景


实现,有两种组合模式:安全组合模式和透明组合模式

安全组合模式:

定义一个抽象根节点 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.添加节点很方便,符合开闭原则。

缺点:

新增节点时不好对枝干中的结构类型进行限制,必须进行类型检查,实现起来较为复杂。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容