組合模式屬于結(jié)構(gòu)型模式,其意圖是將對象組合成樹形結(jié)構(gòu)以表示部分-整體的層次結(jié)構(gòu),composite模式使得用戶對單個對象和組合對象的使用具有一致性。Composite模式的一個重要思想是遞歸組合,關(guān)鍵是一個抽象類,它既可以代表組合對象,又可以代表一個被組合的對象。經(jīng)常在Java開發(fā)中遇到的容器就使用了組合模式,一方面組件可以放在容器中,另一方面容器也可以作為組件放在另外的容器中。
實用性:
l 你想表示對象的部分-整體層次結(jié)構(gòu)
l 你希望用戶忽略組合對象與單個對象的不同,用戶同意地使用組合結(jié)構(gòu)中的所有對象。
參與者:
Component
為組合中的對象聲明接口。
在適當?shù)那闆r下,實現(xiàn)所有類共有接口的缺省行為。
聲明一個接口用于訪問和管理Componebt 的子組件。
在遞歸結(jié)構(gòu)中定義一個接口,用于訪問一個父組件,并在合適的情況下實現(xiàn)。
Leaf
在組合中表示葉節(jié)點對象,葉節(jié)點對象沒有子節(jié)點。
在組合中定義圖元對象的行為。
Composite
定義有子部件的那些部件的行為
存儲子部件,
在Component接口中實現(xiàn)與子部件有關(guān)的操作。
Client
通過Component接口操縱組合部件的對象。
其協(xié)作過程是:用戶使用Compoment類接口與組合結(jié)構(gòu)中的對象進行交互。如果接受者是一個葉節(jié)點,則直接處理請求。如果接受者是Composite,它通常將請求發(fā)送給他的字部件,在轉(zhuǎn)發(fā)請求之前或者之后可能執(zhí)行一些輔助操作。
在本例子中,沒有什么特殊之處,所不同的是Composite可以容納Component的子類對象,包括本身。例子本省也比較簡單,平淡無味,單卻可以在特定的場景能很好的解決特定的問題。
使用組合模式有如下的好處:
l
定義了飽含基本對象和組合對象的類層次結(jié)構(gòu),基本對象可以被組合成更復(fù)雜的組合對象,而這個組合對象有可以被組合。
l
簡化客戶代碼 客戶可以一直地使用組合結(jié)構(gòu)和單個對象,通常用戶不知道處理的是一個葉節(jié)點還是一個組合組件。
l
使得更容易增加新類型的組件, 新定義的Composite或leaf子類自動地與義有的結(jié)構(gòu)和客戶代碼一起工作,客戶程序不需要因為新的Component類而改變。
l
使你的設(shè)計變得更一般化。
實現(xiàn)的代碼:
Component接口:
package composite;
public interface Component{
public int getSize();
public int getChildNum();
public String getType();
public String getName();
public void add(Component c);
public void remove(Component c);
}
Leaf類:
package composite;
public class Leaf implements Component{
private int size;
private String name;
public Leaf(String aName,int aSize){
size = aSize;
name = aName;
}
public String getName(){
return name;
}
public String getType(){
return "Leaf";
}
public int getSize(){
return size;
}
public int getChildNum(){
return 1;
}
public void add(Component c){
System.err.println("Not supported method!");
}
public void remove(Component c){
System.err.println("Not supported method!");
}
}
Composite類:
package composite;
public class Leaf implements Component{
private int size;
private String name;
public Leaf(String aName,int aSize){
size = aSize;
name = aName;
}
public String getName(){
return name;
}
public String getType(){
return "Leaf";
}
public int getSize(){
return size;
}
public int getChildNum(){
return 1;
}
public void add(Component c){
System.err.println("Not supported method!");
}
public void remove(Component c){
System.err.println("Not supported method!");
}
}
客戶端代碼:
package composite;
public class Client{
public static void main(String[] args){
Component root = new Composite("root");
Component composite = new Composite("composite");
Component leaf1 = new Leaf("leaf1",20);
Component leaf2 = new Leaf("leaf2",40);
root.add(leaf1);
composite.add(leaf2);
root.add(composite);
String str = "Leaf1's size is "+leaf1.getSize();
str
+= "\nleaf2's size is " + leaf2.getSize();
str
+= "\nComposite's size is
" + composite.getSize();
str
+= "\nRoot's size is " + root.getSize();
System.out.println(str);
}
}
總結(jié):組合模式在 解決整體與部分 的問題中 應(yīng)用比較廣泛,一個組合也可以被看作 部分來處理,降低了處理問題的難度。
本文出自 “凌輝” 博客,請務(wù)必保留此出處http://tianli.blog.51cto.com/190322/34416 |
|
來自: 靜聽沙漏 > 《研磨設(shè)計模式》