? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Java----組合模式
出處地址http://www.cnblogs.com/V1haoge/p/6489827.html
組合模式命雀,就是在一個對象中包含其他對象权她,這些被包含的對象可能是終點(diǎn)對象(不再包含別的對象),也有可能是非終點(diǎn)對象(其內(nèi)部還包含其他對象媒咳,或叫組對象),我們將對象稱為節(jié)點(diǎn)增炭,即一個根節(jié)點(diǎn)包含許多子節(jié)點(diǎn)凰盔,這些子節(jié)點(diǎn)有的不再包含子節(jié)點(diǎn),而有的仍然包含子節(jié)點(diǎn)掷贾,以此類推睛榄。很明顯,這是樹形結(jié)構(gòu)想帅,終結(jié)點(diǎn)叫葉子節(jié)點(diǎn)场靴,非終節(jié)點(diǎn)(組節(jié)點(diǎn))叫樹枝節(jié)點(diǎn),第一個節(jié)點(diǎn)叫根節(jié)點(diǎn)。同時也類似于文件目錄的結(jié)構(gòu)形式:文件可稱之為終節(jié)點(diǎn)旨剥,目錄可稱之為非終節(jié)點(diǎn)(組節(jié)點(diǎn))咧欣。
1、我們首先來看一個目錄結(jié)構(gòu)的普通實(shí)現(xiàn):
目錄節(jié)點(diǎn):Noder
文件節(jié)點(diǎn):Filer
測試類:Clienter
2轨帜、組合模式
從上面的代碼中可以看出魄咕,我們分別定義了文件節(jié)點(diǎn)對象與目錄節(jié)點(diǎn)對象,這是因為文件與目錄之間的操作不同蚌父,文件沒有下級節(jié)點(diǎn)哮兰,而目錄可以有下級節(jié)點(diǎn),但是我們能不能這么想:既然文件與目錄都是可以作為一個節(jié)點(diǎn)的下級節(jié)點(diǎn)而存在苟弛,那么我們可不可以將二者抽象為一類對象喝滞,雖然二者的操作不同,但是我們可以在實(shí)現(xiàn)類的方法實(shí)現(xiàn)中具體定義膏秫,比如文件沒有新增下級節(jié)點(diǎn)的方法右遭,我們就可以在文件的這個方法中拋出一個異常,不做具體實(shí)現(xiàn)缤削,而在目錄中則具體實(shí)現(xiàn)新增操作窘哈。顯示操作二者都有,可以各自實(shí)現(xiàn)僻他。而且由于我們將文件與目錄抽象為一個類型宵距,那么結(jié)合多態(tài)我們可以進(jìn)行如下實(shí)現(xiàn):
抽象類:Node
文件實(shí)現(xiàn)類:Filter
目錄實(shí)現(xiàn)類:Noder
測試類:Clienter
從上述實(shí)現(xiàn)中可以看出:所謂組合模式,其實(shí)說的是對象包含對象的問題吨拗,通過組合的方式(在對象內(nèi)部引用對象)來進(jìn)行布局满哪,我認(rèn)為這種組合是區(qū)別于繼承的,而另一層含義是指樹形結(jié)構(gòu)子節(jié)點(diǎn)的抽象(將葉子節(jié)點(diǎn)與數(shù)枝節(jié)點(diǎn)抽象為子節(jié)點(diǎn))劝篷,區(qū)別于普通的分別定義葉子節(jié)點(diǎn)與數(shù)枝節(jié)點(diǎn)的方式哨鸭。
3、組合模式應(yīng)用場景
這種組合模式正是應(yīng)樹形結(jié)構(gòu)而生娇妓,所以組合模式的使用場景就是出現(xiàn)樹形結(jié)構(gòu)的地方像鸡。比如:文件目錄顯示,多及目錄呈現(xiàn)等樹形結(jié)構(gòu)數(shù)據(jù)的操作哈恰。