開篇引言:“從前有座山,山上有個(gè)廟陋桂,廟里有個(gè)和尚在講故事,講什么故事呢汗贫?將從前有座山落包,山上有個(gè)廟摊唇,廟里有個(gè)和尚在講故事,講什么故事呢有序?從前岛请。崇败。。后室“杜”
對于Android開發(fā)者來說,下面這幅圖應(yīng)該會(huì)很熟悉痛黎。在一個(gè)APP頁面中,經(jīng)常是一個(gè)ViewGroup
容器包含了眾多子ViewGroup
和View
桌肴,就像老和尚講故事那樣琉历,層層嵌套,組成一個(gè)樹形結(jié)構(gòu)彪置。
在面向?qū)ο蟮氖澜缰腥裁礃拥膶ο蟛拍芙M合成樹形結(jié)構(gòu)呢潘懊?用“本是同根生”這句來表示是最合適不過贿衍。我們知道面向?qū)ο蟮囊淮筇卣骶褪抢^承,一個(gè)基類可以派生出若干之類释树,之類又可以繼續(xù)派生之類。這樣子子孫孫無窮匱也奢啥。最終構(gòu)成了樹形結(jié)構(gòu)桩盲。用英文表達(dá)更合適:Family Tree席吴。也就是說在面向?qū)ο蟮氖澜缰校^承關(guān)系是組合模式的前提條件姑曙。而之所以用繼承迈倍,是因?yàn)橹悡碛辛烁割愊嗨频奶卣鳌?br> 所以組合模式的定義就很好理解了:把一組相似的對象當(dāng)作一個(gè)單一的對象啼染。組合模式依據(jù)樹形結(jié)構(gòu)來組合對象,用來表示部分以及整體層次卦洽。
可以說組合模式可以總結(jié)如下:
1阀蒂、在繼承關(guān)系中,因?yàn)樽宇惪梢栽L問父類的相關(guān)方法蚤霞,所以子類可以當(dāng)做父類來使用昧绣。整體上來看夜畴,就是樹形結(jié)構(gòu)中的所有元素可以當(dāng)做一種元素來處理删壮,比如上圖中不論是ViewGroup
還是View
,都可以當(dāng)做其View來處理兔簇,因?yàn)樗麄兌加泄餐母割惙椒⑺觥T诒热瑛B類可以分成鴿子狸窘、老鷹坯认,白鶴牛哺、布谷鳥、鸚鵡等等等巩趁,而“天高任鳥飛”中的這個(gè)“鳥”可不是特指某一種鳥议慰,而是所有會(huì)飛的鳥蠢古。
2草讶、看本文開始的圖炉菲,每個(gè)ViewGroup
都含有ViewGroup
和View
,很明顯的可以看出整體和局部的關(guān)系践啄。
組合模式的使用場景很廣泛沉御,如果你使用過Json格式的數(shù)據(jù)的話吠裆,對這種模式肯定陌生,比如Gson的JsonElement诵棵,就是組合模式的一個(gè)經(jīng)典應(yīng)用履澳。
如果你學(xué)習(xí)過Flutter的話怀跛,那么也應(yīng)該對此模式不會(huì)陌生距贷,比如Flutter的Element也是應(yīng)用了組合模式,見下圖:
組合模式的理解并不難吻谋,在這里就不在寫代碼例子了忠蝗,感覺沒啥必要。