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

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

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

    今天開始學習Composite模式,首先讓我們看一下它的定義:
     將對象組合成樹形結構以表示“整體—部分”的層次結構。Composite模式使單個對象和組合對象的使用具有一致性。
    下面給出這個模式的結構圖:
     
    如果把Composite模式看成是樹形結構的話,那么它主要角色有:
    1) 樹干角色(Component):該角色是一個抽象類,它定義了一些操作增刪樹葉(Leaf)的操作。
    2) 樹枝角色(Composite):樹枝上有很多樹干,樹枝也是樹干的一種。
    3) 樹葉角色(Leaf):樹干上的樹葉,也就是Component中的具體操作對象。
    說到Composite模式,讓我想到以前項目中遇到的一個問題,做一個影視節目列表的樹形結構,要求支持二級分類,由于當時還沒接觸過設計模式,這個東西讓我搞了好久,才弄好。
    現在使用Composite模式來解決這個問題,簡直太簡單了,別說是二級了,N級都沒問題。下面我就用Composite來實現它,代碼如下:
    import java.util.ArrayList;

    abstract class MovieClass{//Component
     public String name;
     public ArrayList<MovieClass> list;
     public abstract void add(MovieClass component);
     public abstract void remove(MovieClass component);
     public abstract void display();
     
    }
    class Program extends MovieClass{//Leaf
     public Program(String name){
      this.name=name;
     }

     public void add(MovieClass component){
      
      System.out.println("you can't add component to a proagram object");
     }

     public void display() {
      System.out.println("----------"+name);
     }

     public void remove(MovieClass component) {
      System.out.println("you can't remove component to a proagram object");
     }
     
    }
    class ConcreteMovieClass extends MovieClass{//Composite

     public ConcreteMovieClass(String name){
      this.name=name;
      list=new ArrayList<MovieClass>();
     }
     public void add(MovieClass component) {
      list.add(component);
      
     }

     public void remove(MovieClass component) {
      if(list.contains(component)){
        list.remove(component);
      }
      
     }
     public void display(){
      System.out.println(name);
      for(MovieClass mc:list){
       mc.display();
      }
     }
    }
    public class Client {
     public static void main(String args[]){
      Program pro=new Program("大漢天子");
      Program pro2=new Program("貞觀長歌");
      ConcreteMovieClass cmc=new ConcreteMovieClass("電視連續劇");//一級分類
      cmc.add(pro);
      cmc.add(pro2);
      Program pro3=new Program("滿城盡帶黃金甲");
      Program pro4=new Program("色戒");
      ConcreteMovieClass cmc2=new ConcreteMovieClass("最新影視");//一級分類
      cmc2.add(pro3);
      cmc2.add(pro4);
      Program pro5=new Program("越獄");
      Program pro6=new Program("英雄");
      ConcreteMovieClass secondCmc=new ConcreteMovieClass("熱播美劇");//二級分類
      secondCmc.add(pro5);
      secondCmc.add(pro6);
      cmc2.add(secondCmc);//在一級分類(最新影視)下添加二級分類熱播美劇
      ConcreteMovieClass root=new ConcreteMovieClass("root");
      root.add(cmc);
      root.add(cmc2);
      
      root.display();//顯示節目列表
      
     }
     
    }
    這個例子只是一個簡單的模擬并不通用,在我們的實際應用中,節目的來源(也就是Leaf)基本上都是從數據中讀出來放到一個javabean中,我們不可能讓這個bean來再來繼承我們的(Component),至少絕大部分情況是這樣,而且還要有很多操作要實現,如判斷一個component是否是單個對象還是一個對象的組合,這個對象是否有子節點(Component),父節點(Component)以及異常處理等等。實現一個樹形菜單的通用程序并不是那么容易的事。由于大家對設計模式關注不是太高(我寫了那么多設計模式的文章,連個拍磚的都沒有,傷心。。。。。。),以后有時間我再補上。
    Composite模式優缺點及適用情況:
    1) 優點:使客戶端調用簡單,客戶端可以一致的使用組合結構或其中單個對象,用戶就不必關系自己處理的是單個對象還是整個組合結構,這就簡化了客戶端代碼。
    2)缺點:我覺得Leaf類完全不應該來實現Component,應為它基本只是使用一個顯示的作用,不能進行其他的操作如添加、刪除等,如果實現Component容易產生誤操作。
    3)適用情況:比較適合做各種各樣的樹形菜單。


     

    Feedback

    # re: 設計模式學習筆記(二十一)—Composite模式   回復  更多評論   

    2007-12-19 11:13 by 申少
    我也正在學習設計模式,謝謝你的文章。

    # re: 設計模式學習筆記(二十一)—Composite模式   回復  更多評論   

    2008-05-12 11:22 by orange
    寫的挺好的 那我就拍個磚 表傷心了 哈哈

    # re: 設計模式學習筆記(二十一)—Composite模式   回復  更多評論   

    2013-10-28 10:00 by 向日葵大俠
    謝謝樓主的文章

    posts - 146, comments - 143, trackbacks - 0, articles - 0

    Copyright © flustar

    主站蜘蛛池模板: 亚洲成年网站在线观看| 国产亚洲欧洲Aⅴ综合一区| 亚洲日本在线看片| 你懂的在线免费观看| 亚洲日韩涩涩成人午夜私人影院| 亚洲AV电影天堂男人的天堂| 日韩免费视频网站| 国产亚洲精品AAAA片APP| 国产裸模视频免费区无码| 色屁屁www影院免费观看视频| 四虎永久免费地址在线网站| 羞羞视频免费观看| 亚洲欧洲日产国码一级毛片| 插鸡网站在线播放免费观看| 亚洲毛片αv无线播放一区| 免费看搞黄视频网站| 亚洲欧洲无码一区二区三区| 成人免费无码大片A毛片抽搐| 亚洲妇女无套内射精| 国产精品区免费视频| 久久精品国产亚洲AV电影| 在线观看成人免费视频不卡| 亚洲欧美日韩久久精品| 免费A级毛片无码久久版| 在线免费视频你懂的| 亚洲专区在线视频| 成年女人午夜毛片免费看| 免费一级做a爰片久久毛片潮| 国产精品亚洲片在线观看不卡| 1000部羞羞禁止免费观看视频| 亚洲Av无码一区二区二三区| 国产伦精品一区二区三区免费迷 | 国产亚洲欧美在线观看| 国产亚洲人成A在线V网站| 在线美女免费观看网站h| 亚洲av无码专区青青草原| 亚洲日本一区二区三区在线 | 香蕉高清免费永久在线视频| 香蕉免费在线视频| 亚洲国产午夜电影在线入口| 亚洲国产综合久久天堂|