美文网首页
设计模式之组合模式

设计模式之组合模式

作者: 夜色流冰 | 来源:发表于2021-04-10 08:37 被阅读0次

    开篇引言:“从前有座山,山上有个庙,庙里有个和尚在讲故事,讲什么故事呢?将从前有座山,山上有个庙,庙里有个和尚在讲故事,讲什么故事呢?从前。。。。”

    对于Android开发者来说,下面这幅图应该会很熟悉。在一个APP页面中,经常是一个ViewGroup容器包含了众多子ViewGroupView,就像老和尚讲故事那样,层层嵌套,组成一个树形结构。

    在这里插入图片描述
    在面向对象的世界中,什么样的对象才能组合成树形结构呢?用“本是同根生”这句来表示是最合适不过。我们知道面向对象的一大特征就是继承,一个基类可以派生出若干之类,之类又可以继续派生之类。这样子子孙孙无穷匮也。最终构成了树形结构。用英文表达更合适:Family Tree。也就是说在面向对象的世界中,继承关系是组合模式的前提条件。而之所以用继承,是因为之类拥有了父类相似的特征。
    所以组合模式的定义就很好理解了:把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

    可以说组合模式可以总结如下:

    1、在继承关系中,因为子类可以访问父类的相关方法,所以子类可以当做父类来使用。整体上来看,就是树形结构中的所有元素可以当做一种元素来处理,比如上图中不论是ViewGroup还是View,都可以当做其View来处理,因为他们都有共同的父类方法。在比如鸟类可以分成鸽子、老鹰,白鹤、布谷鸟、鹦鹉等等等,而“天高任鸟飞”中的这个“鸟”可不是特指某一种鸟,而是所有会飞的鸟。

    2、看本文开始的图,每个ViewGroup都含有ViewGroupView,很明显的可以看出整体和局部的关系。

    组合模式的使用场景很广泛,如果你使用过Json格式的数据的话,对这种模式肯定陌生,比如Gson的JsonElement,就是组合模式的一个经典应用。

    在这里插入图片描述

    如果你学习过Flutter的话,那么也应该对此模式不会陌生,比如FlutterElement也是应用了组合模式,见下图:

    在这里插入图片描述
    组合模式的理解并不难,在这里就不在写代码例子了,感觉没啥必要。

    相关文章

      网友评论

          本文标题:设计模式之组合模式

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