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

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

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

    posts - 73,  comments - 55,  trackbacks - 0

    Composite模式定義:
    將對象以樹形結(jié)構(gòu)組織起來,以達(dá)成“部分-整體” 的層次結(jié)構(gòu),使得客戶端對單個對象和組合對象的使用具有一致性.

    Composite比較容易理解,想到Composite就應(yīng)該想到樹形結(jié)構(gòu)圖。組合體內(nèi)這些對象都有共同接口,當(dāng)組合體一個對象的方法被調(diào)用執(zhí)行時,Composite將遍歷(Iterator)整個樹形結(jié)構(gòu),尋找同樣包含這個方法的對象并實(shí)現(xiàn)調(diào)用執(zhí)行??梢杂脿恳粍影賮硇稳?。

    所以Composite模式使用到Iterator模式,和Chain of Responsibility模式類似。

    Composite好處:
    1.使客戶端調(diào)用簡單,客戶端可以一致的使用組合結(jié)構(gòu)或其中單個對象,用戶就不必關(guān)系自己處理的是單個對象還是整個組合結(jié)構(gòu),這就簡化了客戶端代碼。
    2.更容易在組合體內(nèi)加入對象部件. 客戶端不必因?yàn)榧尤肓诵碌膶ο蟛考拇a。

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

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

    public abstract class Equipment
    {
      private String name;
      //實(shí)價(jià)
      public abstract double netPrice();
      //折扣價(jià)格
      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實(shí)價(jià)為1
      public double netPrice() { return 1.; }
      //定義了disk折扣價(jià)格是0.5 對折。
      public double discountPrice() { return .5; }
    }

    Disk是組合體內(nèi)的一個對象,或稱一個部件,這個部件是個單獨(dú)元素( Primitive)。
    還有一種可能是,一個部件也是一個組合體,就是說這個部件下面還有'兒子',這是樹形結(jié)構(gòu)中通常的情況,應(yīng)該比較容易理解?,F(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 之所以沒有,是因?yàn)镈isk是個單獨(dú)(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模式的實(shí)現(xiàn).一般沒必要重載Iterator。

    我們再看看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(),實(shí)際上Composite使用Iterator遍歷了整個樹形結(jié)構(gòu),尋找同樣包含這個方法的對象并實(shí)現(xiàn)調(diào)用執(zhí)行.

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

    以論壇為例,一個版(forum)中有很多帖子(message),這些帖子有原始貼,有對原始貼的回應(yīng)貼,是個典型的樹形結(jié)構(gòu),那么當(dāng)然可以使用Composite模式,那么我們進(jìn)入Jive中看看,是如何實(shí)現(xiàn)的.

    Jive解剖
    在Jive中 ForumThread是ForumMessages的容器container(組合體).也就是說,F(xiàn)orumThread類似我們上例中的 CompositeEquipment.它和messages的關(guān)系如圖:
    [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, 提供用于訪問自己組合體內(nèi)的部件方法: 增加 刪除 遍歷.
    --------------------------------------

    ??? Composite模式的意圖是“將對象組合成樹形結(jié)構(gòu)表示‘整體-部分’的層次結(jié)構(gòu)。Composite使得用戶對單個對象和組合對象的使用更具有一致性”。

    ??? 在Word中我們經(jīng)常會將一些圖元進(jìn)行“組合”,組合以后的圖形還可以向簡單圖元那樣進(jìn)行移動、變形等等操作;除此以外,在Word中,我們對于一個字符、一個詞組、一句話、一個段落,甚至是整篇文章的操作是相同的,我們都可以進(jìn)行剪切、復(fù)制,進(jìn)行字體與大小的調(diào)整,進(jìn)行顏色的變換。這些例子都是Composite模式的實(shí)例,我們將簡單的元素組合成復(fù)雜的元素,然后還可以像操作簡單元素那樣操作組合元素。

    ??? Composite模式將子元素組織成樹型,實(shí)際上,組織成圖型也沒有問題。用戶總是喜歡組合簡單元素,一方面,用戶可以通過這樣的組合來進(jìn)行抽象,另一方面,用戶可以通過組合化簡繁瑣的操作。Composite模式在各種可視化編輯軟件中應(yīng)用得最為廣泛。

    ??? 另一使用Composite的經(jīng)典例子是Java的Swing系統(tǒng)。所有的Swing組件都是繼承自一個叫做JComponent的接口,因此,我們對一個JFrame的操作和對一個JButton的操作是一樣的。這同時也使得,JFrame在管理自己的子元素時,它不需要知道他們是一個JButton還是一個JPanel,對它來說,這只是一個JComponent。

    ??? 實(shí)現(xiàn)Composite模式的關(guān)鍵是良好設(shè)計(jì)的接口,人們應(yīng)該對可能的元素(簡單的、組合的)進(jìn)行分析,并設(shè)計(jì)出通用的操作。盡可能的保證接口操作對所有元素都是有意義的,否則就應(yīng)該將那些只對部分元素有意義的操作下放到子類中。

    posted on 2006-07-31 17:16 保爾任 閱讀(806) 評論(0)  編輯  收藏 所屬分類: Design Patten

    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲成av人在线视| 国产老女人精品免费视频| 羞羞的视频在线免费观看| 久久www免费人成看片| 中文字幕免费在线视频| 波多野结衣免费在线观看| 日韩精品极品视频在线观看免费| 亚洲国产成人久久综合碰| 免费日本黄色网址| 亚洲色中文字幕无码AV| 亚洲avav天堂av在线不卡| 亚洲精品无码久久久久久久 | 亚洲av片不卡无码久久| 亚洲精品无码久久久久牙蜜区| 亚洲日韩v无码中文字幕| 久久精品国产亚洲av麻豆色欲| avtt亚洲天堂| 91亚洲国产成人久久精品| 亚洲不卡中文字幕无码| 亚洲精品国产成人| 男人和女人高潮免费网站| 亚欧色视频在线观看免费| 国产成人综合亚洲AV第一页 | 精品日韩亚洲AV无码 | 国产亚洲精品免费视频播放| 青青久在线视频免费观看| 日产亚洲一区二区三区| 亚洲春色在线视频| 国产亚洲大尺度无码无码专线 | 日本午夜免费福利视频| 好爽…又高潮了免费毛片| 最近免费中文字幕mv电影| 国产成人精品久久亚洲高清不卡 | 国产免费av片在线播放| 毛片网站免费在线观看| 亚洲一卡2卡4卡5卡6卡在线99 | www.亚洲精品.com| 一级毛片免费播放试看60分钟| 亚洲第一第二第三第四第五第六| 免费国产成人α片| 亚洲伊人久久综合影院|