<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Swing


    天行健 君子以自強不息

    posts - 69, comments - 215, trackbacks - 0, articles - 16
       :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
    Composite定義:
    將對象以樹形結(jié)構(gòu)組織起來,以達成“部分-整體” 的層次結(jié)構(gòu),使得客戶端對單個對象和組合對象的使用具有一致性.

    使用Composite
    首先定義一個接口或抽象類,這是設(shè)計模式通用方式了,其他設(shè)計模式對接口內(nèi)部定義限制不多,Composite卻有個規(guī)定,那就是要在接口內(nèi)部定義一個用于訪問和管理Composite組合體的對象們(或稱部件Component).

    下面的代碼是以抽象類定義,一般盡量用接口interface,

    public abstract class Equipment
    {
      private String name;
      //網(wǎng)絡(luò)價格
      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網(wǎng)絡(luò)價格為1
      public double netPrice() { return 1.; }
      //定義了disk折扣價格是0.5 對折。
      public double discountPrice() { return .5; }
    }

    Disk是組合體內(nèi)的一個對象,或稱一個部件,這個部件是個單獨元素( Primitive)。
    還有一種可能是,一個部件也是一個組合體,就是說這個部件下面還有'兒子',這是樹形結(jié)構(gòu)中通常的情況,應(yīng)該比較容易理解。現(xiàn)在我們先要定義這個組合體:

    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;
      }
      

      //注意這里,這里就提供用于訪問自己組合體內(nèi)的部件方法。
      //上面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模式的實現(xiàn).

    我們再看看CompositeEquipment的兩個具體類:盤盒Chassis和箱子Cabinet,箱子里面可以放很多東西,如底板,電源盒,硬盤盒等;盤盒里面可以放一些小設(shè)備,如硬盤 軟驅(qū)等。無疑這兩個都是屬于組合體性質(zhì)的。

    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模式的架構(gòu)。

    我們可以看看客戶端調(diào)用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"));

    //調(diào)用 netPrice()方法;
    System.out.println("netPrice="+cabinet.netPrice());
    System.out.println("discountPrice="+cabinet.discountPrice());

    上面調(diào)用的方法netPrice()或discountPrice(),實際上Composite使用Iterator遍歷了整個樹形結(jié)構(gòu),尋找同樣包含這個方法的對象并實現(xiàn)調(diào)用執(zhí)行.

    Composite是個很巧妙體現(xiàn)智慧的模式,在實際應(yīng)用中,如果碰到樹形結(jié)構(gòu),我們就可以嘗試是否可以使用這個模式。

    主站蜘蛛池模板: 四虎永久在线精品免费影视| 成年美女黄网站色大免费视频| 亚洲成AV人网址| 美女被免费视频网站a| 免费国产在线观看| 日韩在线一区二区三区免费视频| 国产高清免费在线| 污视频网站免费观看| 亚洲国产香蕉人人爽成AV片久久| 污污视频免费观看网站| 久久亚洲精品无码播放| aa级女人大片喷水视频免费| 久久香蕉国产线看观看亚洲片| 无码精品国产一区二区三区免费 | 亚洲美日韩Av中文字幕无码久久久妻妇| 亚洲精品亚洲人成在线| 国产成人免费a在线资源| 男女作爱免费网站| 亚洲狠狠婷婷综合久久久久| 无码精品人妻一区二区三区免费看 | 亚洲aⅴ无码专区在线观看春色 | 波多野结衣久久高清免费| 国产亚洲美女精品久久久久| 精品亚洲成α人无码成α在线观看| 男女一进一出抽搐免费视频| 亚洲香蕉免费有线视频| 最近免费中文字幕大全| 国产亚洲成在线播放va| 亚洲不卡av不卡一区二区| 99久久久国产精品免费无卡顿| 激情婷婷成人亚洲综合| 亚洲精品卡2卡3卡4卡5卡区| 亚洲啪啪免费视频| 黄页网站在线观看免费| 亚洲尹人九九大色香蕉网站| 国产网站在线免费观看| 嫩草在线视频www免费观看| 亚洲色大18成人网站WWW在线播放 亚洲色大成WWW亚洲女子 | 久久精品国产96精品亚洲| 成人无遮挡毛片免费看| 国产又黄又爽又大的免费视频 |