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