美文网首页Android技术知识Android知识Android开发
每日Android源码设计模式之-18、组合模式

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

作者: Alexey | 来源:发表于2017-04-05 22:15 被阅读0次

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


    定义:

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


    使用场景:

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

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


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

    安全组合模式:

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

    缺点:

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

    相关文章

      网友评论

        本文标题:每日Android源码设计模式之-18、组合模式

        本文链接:https://www.haomeiwen.com/subject/nkoxattx.html