程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java設計形式之組合形式(Composite形式)引見

Java設計形式之組合形式(Composite形式)引見

編輯:關於JAVA

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源代碼,你確定沒法看懂。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved