Java設計形式之組合形式(Composite形式)引見。本站提示廣大學習愛好者:(Java設計形式之組合形式(Composite形式)引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Java設計形式之組合形式(Composite形式)引見正文
Composite界說:將對象以樹形構造組織起來,以殺青“部門-全體” 的條理構造,使得客戶端對單個對象和組合對象的應用具有分歧性。
Composite比擬輕易懂得,想到Composite就應當想到樹形構造圖。組合體內這些對象都有配合接口,當組合體一個對象的辦法被挪用履行時,Composite將遍歷(Iterator)全部樹形構造,尋覓異樣包括這個辦法的對象並完成挪用履行。可以用牽一動百來描述。
所以Composite形式應用到Iterator形式,和Chain of Responsibility形式相似。
Composite利益:
1.使客戶端挪用簡略,客戶端可以分歧的應用組合構造或個中單個對象,用戶就不用關系本身處置的是單個對象照樣全部組合構造,這就簡化了客戶端代碼。
2.更輕易在組合體內參加對象部件。客戶端不用由於參加了新的對象部件而更改代碼。
若何應用Composite
起首界說一個接口或籠統類,這是設計形式通用方法了,其他設計形式對接口外部界說限制不多,Composite卻有個劃定,那就是要在接口外部界說一個用於拜訪和治理Composite組合體的對象們(或稱部件Component)。
上面的代碼是以籠統類界說,普通盡可能用接口interface。
public abstract class Equipment{
private String name;
//收集價錢
public abstract double netPrice();
//扣頭價錢
public abstract double discountPrice();
//增長部件辦法
public boolean add(Equipment equipment) { return false; }
//刪除部件辦法
public boolean remove(Equipment equipment) { return false; }
//留意這裡,這裡就供給一種用於拜訪組合體類的部件辦法。
public Iterator iter() { return null; }
public Equipment(final String name) { this.name=name; }
}
籠統類Equipment就是Component界說,代表著組合體類的對象們,Equipment中界說幾個配合的辦法。
public class Disk extends Equipment{
public Disk(String name) { super(name); }
//界說Disk收集價錢為1
public double netPrice() { return 1.; }
//界說了disk扣頭價錢是0.5 半數。
public double discountPrice() { return .5; }
}
Disk是組合體內的一個對象,或稱一個部件,這個部件是個零丁元素( Primitive)。
還有一種能夠是,一個部件也是一個組合體,就是說這個部件上面還有'兒子',這是樹形構造中平日的情形,應當比擬輕易懂得。如今我們先要界說這個組合體:
abstract class CompositeEquipment extends Equipment{
private int i=0;
//界說一個Vector 用來寄存'兒子'
private Lsit equipment=new ArrayList();
public CompositeEquipment(String name) { super(name); }
public boolean add(Equipment equipment) {
this.equipment.add(equipment);
return true;
}
public double netPrice(){
double netPrice=0.;
Iterator iter=equipment.iterator();
for(iter.hasNext())
netPrice+=((Equipment)iter.next()).netPrice();
return netPrice;
}
public double discountPrice(){
double discountPrice=0.;
Iterator iter=equipment.iterator();
for(iter.hasNext())
discountPrice+=((Equipment)iter.next()).discountPrice();
return discountPrice;
}
//留意這裡,這裡就供給用於拜訪本身組合體內的部件辦法。
//下面dIsk 之所以沒有,是由於Disk是個零丁(Primitive)的元素.
public Iterator iter(){
return equipment.iterator() ;
}
//重載Iterator辦法
public boolean hasNext() { return i<equipment.size(); }
//重載Iterator辦法
public Object next(){
if(hasNext())
return equipment.elementAt(i++);
else
throw new NoSuchElementException();
}
}
下面CompositeEquipment繼續了Equipment,同時為本身外面的對象們供給了內部拜訪的辦法,重載了Iterator,Iterator是Java的Collection的一個接口,是Iterator形式的完成。
我們再看看CompositeEquipment的兩個詳細類:盤盒Chassis和箱子Cabinet,箱子外面可以放許多器械,如底板,電源盒,硬盤盒等;盤盒外面可以放一些小裝備,如硬盤 軟驅等。無疑這兩個都是屬於組合體性質的。
public class Chassis extends CompositeEquipment{
public Chassis(String name) { super(name); }
public double netPrice() { return 1.+super.netPrice(); }
public double discountPrice() { return .5+super.discountPrice(); }
}
public class Cabinet extends CompositeEquipment{
public Cabinet(String name) { super(name); }
public double netPrice() { return 1.+super.netPrice(); }
public double discountPrice() { return .5+super.discountPrice(); }
}
至此我們完成了全部Composite形式的架構。
我們可以看看客戶端挪用Composote代碼:
Cabinet cabinet=new Cabinet("Tower");
Chassis chassis=new Chassis("PC Chassis");
//將PC Chassis裝到Tower中 (將盤盒裝到箱子裡)
cabinet.add(chassis);
//將一個10GB的硬盤裝到 PC Chassis (將硬盤裝到盤盒裡)
chassis.add(new Disk("10 GB"));
//挪用 netPrice()辦法;
System.out.println("netPrice="+cabinet.netPrice());
System.out.println("discountPrice="+cabinet.discountPrice());
下面挪用的辦法netPrice()或discountPrice(),現實上Composite應用Iterator遍歷了全部樹形構造,尋覓異樣包括這個辦法的對象並完成挪用履行。
Composite是個很奇妙表現聰明的形式,在現實運用中,假如碰著樹形構造,我們便可以測驗考試能否可使用這個形式。
以服裝論壇t.vhao.net為例,一個版(forum)中有許多帖子(message),這些帖子有原始貼,有對原始貼的回應貼,是個典范的樹形構造,那末固然可使用Composite形式,那末我們進入Jive中看看,是若何完成的.
Jive剖解
在Jive中 ForumThread是ForumMessages的容器container(組合體)。也就是說,ForumThread相似我們上例中的 CompositeEquipment.它和messages的關系以下所示:
[thread]
|- [message]
|- [message]
|- [message]
|- [message]
|- [message]
我們在ForumThread看到以下代碼:
public interface ForumThread {
....
public void addMessage(ForumMessage parentMessage, ForumMessage newMessage)
throws UnauthorizedException;
public void deleteMessage(ForumMessage message)
throws UnauthorizedException;
public Iterator messages();
....
}
相似CompositeEquipment,供給用於拜訪本身組合體內的部件辦法:增長、刪除、遍歷。
聯合我的其他形式中對Jive的剖析,我們曾經根本年夜體懂得了Jive服裝論壇t.vhao.net系統的框架,假如你之前不睬解設計形式,而直接去看Jive源代碼,你確定沒法看懂。