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

組合模式的優點有哪些呢?第一個優點只要是樹形結構,就要考慮使用組合模式,這個一定記住,只
要是要體現局部和整體的關系的時候,而且這種關系還可能比較深,考慮一下組合模式吧。
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; } }
合成模式的實現根據所實現接口的區別分為兩種形式,分別稱為安全式和透明式。雖然這是模式的實現問題,但是由于它影響到模式結構的細節
?? 合成模式可以不提供對服對象的管理方法,但是合成模式必須在合適的地方提供子對象的管理方法。
??
?? 1)透明方式
?? 作為第一種選擇,在Compotent里面聲明所有的用來管理子類對象的方法,包括add()、remove()、以及getChild()方法。
?? 這樣做的好處是所有的構件類都有相同的接口。在客戶端看來,樹葉類對象與合成類對象的區別起碼在接口層次上消失了,客戶端
?? 可以同等地對待所有的對象。這就是透明形式的合成模式。
??
?? 這個選擇的缺點是不夠安全,因為樹葉對象和組合類對象的在本質上是有區別的。樹葉類對象不可能有下一個層次的對象,
?? 因此add() remove() getChild()方法沒有意義,但是在編譯時期不會出錯,而只會在運行期出錯。
??
?? 2)安全方式
?? 第二種選擇是在Composite類里而聲明所有的用來管理子類對象的方法。這樣的做法是安全的做法。
?? 因為樹葉類型的對象根本就沒有管理子類對象的方法,因此,如果客戶端對樹葉類對象使用這些方法時,程序會在編譯時期出錯。
?? 編譯通不過,就不會出現運行時期錯誤
這個方式的缺點就是不夠透明,因為樹葉類和合成類將具有不同的接口。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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