开篇引言:“从前有座山,山上有个庙,庙里有个和尚在讲故事,讲什么故事呢?将从前有座山,山上有个庙,庙里有个和尚在讲故事,讲什么故事呢?从前。。。。”
对于Android开发者来说,下面这幅图应该会很熟悉。在一个APP页面中,经常是一个ViewGroup
容器包含了众多子ViewGroup
和View
,就像老和尚讲故事那样,层层嵌套,组成一个树形结构。
在面向对象的世界中,什么样的对象才能组合成树形结构呢?用“本是同根生”这句来表示是最合适不过。我们知道面向对象的一大特征就是继承,一个基类可以派生出若干之类,之类又可以继续派生之类。这样子子孙孙无穷匮也。最终构成了树形结构。用英文表达更合适:Family Tree。也就是说在面向对象的世界中,继承关系是组合模式的前提条件。而之所以用继承,是因为之类拥有了父类相似的特征。
所以组合模式的定义就很好理解了:把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
可以说组合模式可以总结如下:
1、在继承关系中,因为子类可以访问父类的相关方法,所以子类可以当做父类来使用。整体上来看,就是树形结构中的所有元素可以当做一种元素来处理,比如上图中不论是ViewGroup
还是View
,都可以当做其View来处理,因为他们都有共同的父类方法。在比如鸟类可以分成鸽子、老鹰,白鹤、布谷鸟、鹦鹉等等等,而“天高任鸟飞”中的这个“鸟”可不是特指某一种鸟,而是所有会飞的鸟。
2、看本文开始的图,每个ViewGroup
都含有ViewGroup
和View
,很明显的可以看出整体和局部的关系。
组合模式的使用场景很广泛,如果你使用过Json格式的数据的话,对这种模式肯定陌生,比如Gson的JsonElement,就是组合模式的一个经典应用。
如果你学习过Flutter的话,那么也应该对此模式不会陌生,比如Flutter的Element也是应用了组合模式,见下图:
组合模式的理解并不难,在这里就不在写代码例子了,感觉没啥必要。
网友评论