国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java設計模式之 Composite(組合)

2019-11-18 12:14:51
字體:
來源:轉載
供稿:網友

  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是個很巧妙體現聰明的模式,在實際應用中,假如碰到樹形結構,我們就可以嘗試是否可以使用這個模式。
  
  以論壇為例,一個版(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, 提供用于訪問自己組合體內的部件方法: 增加 刪除 遍歷.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通许县| 吴堡县| 丰县| 乐亭县| 阳谷县| 玉山县| 哈尔滨市| 宁国市| 浦江县| 礼泉县| 南平市| 萨迦县| 阳曲县| 南郑县| 临泽县| 阿拉尔市| 常山县| 甘谷县| 芷江| 景洪市| 余庆县| 兴宁市| 诏安县| 竹北市| 达州市| 新乡市| 澄城县| 葫芦岛市| 当阳市| 成安县| 柳林县| 崇阳县| 砀山县| 汶上县| 岑溪市| 郯城县| 武宣县| 海城市| 江川县| 娱乐| 上林县|