組合模式(Composite Pattern)有時候又叫做部分-整體模式,它使我們樹型結(jié)構(gòu)的問題中,模糊了簡單元素和復(fù)雜元素的概念,客戶程序可以向處理簡單元素一樣來處理復(fù)雜元素,從而使得客戶程序與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。
組合模式讓你可以優(yōu)化處理遞歸或分級數(shù)據(jù)結(jié)構(gòu)。有許多關(guān)于分級數(shù)據(jù)結(jié)構(gòu)的例子,使得組合模式非常有用武之地。關(guān)于分級數(shù)據(jù)結(jié)構(gòu)的一個普遍性的例子是你每次使用電腦時所遇到的:文件系統(tǒng)。文件系統(tǒng)由目錄和文件組成。每個目錄都可以裝內(nèi)容。目錄的內(nèi)容可以是文件,也可以是目錄。按照這種方式,計算機的文件系統(tǒng)就是以遞歸結(jié)構(gòu)來組織的。如果你想要描述這樣的數(shù)據(jù)結(jié)構(gòu),那么你可以使用組合模式Composite。
1抽象構(gòu)件角色Component:它為組合中的對象聲明接口,也可以為共有接口實現(xiàn)缺省行為。
2樹葉構(gòu)件角色Leaf:在組合中表示葉節(jié)點對象——沒有子節(jié)點,實現(xiàn)抽象構(gòu)件角色聲明的接口。
3樹枝構(gòu)件角色Composite:在組合中表示分支節(jié)點對象——有子節(jié)點,實現(xiàn)抽象構(gòu)件角色聲明的接口;存儲子部件。〕
組合模式的優(yōu)點有哪些呢?第一個優(yōu)點只要是樹形結(jié)構(gòu),就要考慮使用組合模式,這個一定記住,只
要是要體現(xiàn)局部和整體的關(guān)系的時候,而且這種關(guān)系還可能比較深,考慮一下組合模式吧。
component:
leaf:
composite:
Test:
合成模式的實現(xiàn)根據(jù)所實現(xiàn)接口的區(qū)別分為兩種形式,分別稱為安全式和透明式。雖然這是模式的實現(xiàn)問題,但是由于它影響到模式結(jié)構(gòu)的細節(jié)
?? 合成模式可以不提供對服對象的管理方法,但是合成模式必須在合適的地方提供子對象的管理方法。
??
?? 1)透明方式
?? 作為第一種選擇,在Compotent里面聲明所有的用來管理子類對象的方法,包括add()、remove()、以及getChild()方法。
?? 這樣做的好處是所有的構(gòu)件類都有相同的接口。在客戶端看來,樹葉類對象與合成類對象的區(qū)別起碼在接口層次上消失了,客戶端
?? 可以同等地對待所有的對象。這就是透明形式的合成模式。
??
?? 這個選擇的缺點是不夠安全,因為樹葉對象和組合類對象的在本質(zhì)上是有區(qū)別的。樹葉類對象不可能有下一個層次的對象,
?? 因此add() remove() getChild()方法沒有意義,但是在編譯時期不會出錯,而只會在運行期出錯。
??
?? 2)安全方式
?? 第二種選擇是在Composite類里而聲明所有的用來管理子類對象的方法。這樣的做法是安全的做法。
?? 因為樹葉類型的對象根本就沒有管理子類對象的方法,因此,如果客戶端對樹葉類對象使用這些方法時,程序會在編譯時期出錯。
?? 編譯通不過,就不會出現(xiàn)運行時期錯誤
這個方式的缺點就是不夠透明,因為樹葉類和合成類將具有不同的接口。
組合模式讓你可以優(yōu)化處理遞歸或分級數(shù)據(jù)結(jié)構(gòu)。有許多關(guān)于分級數(shù)據(jù)結(jié)構(gòu)的例子,使得組合模式非常有用武之地。關(guān)于分級數(shù)據(jù)結(jié)構(gòu)的一個普遍性的例子是你每次使用電腦時所遇到的:文件系統(tǒng)。文件系統(tǒng)由目錄和文件組成。每個目錄都可以裝內(nèi)容。目錄的內(nèi)容可以是文件,也可以是目錄。按照這種方式,計算機的文件系統(tǒng)就是以遞歸結(jié)構(gòu)來組織的。如果你想要描述這樣的數(shù)據(jù)結(jié)構(gòu),那么你可以使用組合模式Composite。
1抽象構(gòu)件角色Component:它為組合中的對象聲明接口,也可以為共有接口實現(xiàn)缺省行為。
2樹葉構(gòu)件角色Leaf:在組合中表示葉節(jié)點對象——沒有子節(jié)點,實現(xiàn)抽象構(gòu)件角色聲明的接口。
3樹枝構(gòu)件角色Composite:在組合中表示分支節(jié)點對象——有子節(jié)點,實現(xiàn)抽象構(gòu)件角色聲明的接口;存儲子部件。〕

組合模式的優(yōu)點有哪些呢?第一個優(yōu)點只要是樹形結(jié)構(gòu),就要考慮使用組合模式,這個一定記住,只
要是要體現(xiàn)局部和整體的關(guān)系的時候,而且這種關(guān)系還可能比較深,考慮一下組合模式吧。
component:
package pattern.composite; public abstract class Component { String name; String department; String salary; Component parent; public Component(String name, String department, String salary) { this.name = name; this.department = department; this.salary = salary; } public String getInfo() { StringBuffer sb = new StringBuffer(); sb.append(name).append(" " + department).append(" " + salary); return sb.toString(); } public void setParent(Component parent) { this.parent = parent; } public Component getParent() { return parent; } }
leaf:
public class Leaf extends Component{ public Leaf(String name, String department, String salary) { super(name, department, salary); // TODO Auto-generated constructor stub } }
composite:
package pattern.composite; import java.util.ArrayList; import java.util.List; public class Composite extends Component { List<Component> subList = new ArrayList<Component>(); public Composite(String name, String department, String salary) { super(name, department, salary); } public void addSub(Component component) { component.setParent(this); this.subList.add(component); } public List<Component> getSub() { return this.subList; } }
Test:
package pattern.composite; import java.util.ArrayList; import java.util.List; public class Composite extends Component { List<Component> subList = new ArrayList<Component>(); public Composite(String name, String department, String salary) { super(name, department, salary); } public void addSub(Component component) { component.setParent(this); this.subList.add(component); } public List<Component> getSub() { return this.subList; } }
合成模式的實現(xiàn)根據(jù)所實現(xiàn)接口的區(qū)別分為兩種形式,分別稱為安全式和透明式。雖然這是模式的實現(xiàn)問題,但是由于它影響到模式結(jié)構(gòu)的細節(jié)
?? 合成模式可以不提供對服對象的管理方法,但是合成模式必須在合適的地方提供子對象的管理方法。
??
?? 1)透明方式
?? 作為第一種選擇,在Compotent里面聲明所有的用來管理子類對象的方法,包括add()、remove()、以及getChild()方法。
?? 這樣做的好處是所有的構(gòu)件類都有相同的接口。在客戶端看來,樹葉類對象與合成類對象的區(qū)別起碼在接口層次上消失了,客戶端
?? 可以同等地對待所有的對象。這就是透明形式的合成模式。
??
?? 這個選擇的缺點是不夠安全,因為樹葉對象和組合類對象的在本質(zhì)上是有區(qū)別的。樹葉類對象不可能有下一個層次的對象,
?? 因此add() remove() getChild()方法沒有意義,但是在編譯時期不會出錯,而只會在運行期出錯。
??
?? 2)安全方式
?? 第二種選擇是在Composite類里而聲明所有的用來管理子類對象的方法。這樣的做法是安全的做法。
?? 因為樹葉類型的對象根本就沒有管理子類對象的方法,因此,如果客戶端對樹葉類對象使用這些方法時,程序會在編譯時期出錯。
?? 編譯通不過,就不會出現(xiàn)運行時期錯誤
這個方式的缺點就是不夠透明,因為樹葉類和合成類將具有不同的接口。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
