注:本文部分摘自www.jdon.com的《Gof 23種設(shè)計(jì)模式解析》的Composite模式一章
一、Composite模式的定義
將對(duì)象以樹形結(jié)構(gòu)組織起來(lái),以達(dá)成“部分-整體” 的層次結(jié)構(gòu),使得客戶端對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性.
二、Composite模式的特點(diǎn)
Composite比較容易理解,想到Composite就應(yīng)該想到樹形結(jié)構(gòu)圖。組合體內(nèi)這些對(duì)象都有共同接口,當(dāng)組合體一個(gè)對(duì)象的方法被調(diào)用執(zhí)行時(shí),Composite將遍歷(Iterator)整個(gè)樹形結(jié)構(gòu),尋找同樣包含這個(gè)方法的對(duì)象并實(shí)現(xiàn)調(diào)用執(zhí)行。可以用牽一動(dòng)百來(lái)形容。
所以Composite模式使用到Iterator模式,和Chain of Responsibility模式類似。
三、Composite好處
1.使客戶端調(diào)用簡(jiǎn)單,客戶端可以一致的使用組合結(jié)構(gòu)或其中單個(gè)對(duì)象,用戶就不必關(guān)系自己處理的是單個(gè)對(duì)象還是整個(gè)組合結(jié)構(gòu),這就簡(jiǎn)化了客戶端代碼。
2.更容易在組合體內(nèi)加入對(duì)象部件. 客戶端不必因?yàn)榧尤肓诵碌膶?duì)象部件而更改代碼。
四、如何使用Composite
首先定義一個(gè)接口或抽象類,這是設(shè)計(jì)模式通用方式了,其他設(shè)計(jì)模式對(duì)接口內(nèi)部定義限制不多,Composite卻有個(gè)規(guī)定,那就是要在接口內(nèi)部定義一個(gè)用于訪問(wèn)和管理Composite組合體的對(duì)象們(或稱部件Component).
---- 以上內(nèi)容摘自Jdon網(wǎng)站的《Gof 23種設(shè)計(jì)模式》系列文章
五、Composite模式的分析
·Composite模式的結(jié)構(gòu):
基類/接口(構(gòu)件抽象)
|
|--- 原子構(gòu)件(extends 基類 / implements 接口)
|
|--- 組合構(gòu)件(extends 基類 / implements 接口)
|--- 原子構(gòu)件1
|--- 原子構(gòu)件2
|--- 組合構(gòu)件3
|--- 原子構(gòu)件3-1
|--- 原子構(gòu)件3-2
·Composite模式的特點(diǎn):
·Composite模式一般都有一個(gè)抽象類或接口來(lái)表示最基本的構(gòu)件。
·Composite模式一般都由兩類對(duì)象構(gòu)成:表示單個(gè)元素的對(duì)象(Primitive)和表示多個(gè)元素組合的對(duì)象(Composite)
·Composite模式下Primitive和Composite對(duì)象都繼承或?qū)崿F(xiàn)上層接口或父類
·Composite模式下每個(gè)構(gòu)件都含有三個(gè)基礎(chǔ)方法:add(構(gòu)件)、remove(構(gòu)件)、iterator()
·Composite對(duì)象含有一個(gè)用來(lái)保存其下所有基礎(chǔ)元素的的集合,例如:Vector,ArrayList,HashMap
·Composite對(duì)象的方法被調(diào)用時(shí)一般都會(huì)引起其下所有基礎(chǔ)元素相同方法的調(diào)用,即遞歸調(diào)用。
·Composite模式中Primitive對(duì)象和Composite對(duì)象的方法區(qū)別:
·add(構(gòu)件):如果是基礎(chǔ)對(duì)象,則此方法直接返回false,如果是組合對(duì)象,則先添加新構(gòu)件然后返回true
·remove(構(gòu)件):如果是基礎(chǔ)對(duì)象,則此方法直接返回false,如果是組合對(duì)象,則先刪除構(gòu)件然后返回true
·iterator():如果是基礎(chǔ)對(duì)象,則此方法直接返回null,如果是組合對(duì)象,則返回一個(gè)包含所有對(duì)象的集合
·客戶端調(diào)用Composite模式的代碼示例:
·創(chuàng)建一個(gè)原子構(gòu)件對(duì)象
·創(chuàng)建一個(gè)組合構(gòu)件對(duì)象
·調(diào)用組合構(gòu)件對(duì)象的add/remove方法添加/刪除對(duì)象
·調(diào)用組合夠?qū)ο蟮膇teratore方法迭代顯示對(duì)象
下一節(jié)我們將采用一個(gè)真實(shí)的示例來(lái)演示Composite的使用
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。