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

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

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

    今天開(kāi)始學(xué)習(xí)Composite模式,首先讓我們看一下它的定義:
     將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“整體—部分”的層次結(jié)構(gòu)。Composite模式使單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。
    下面給出這個(gè)模式的結(jié)構(gòu)圖:
     
    如果把Composite模式看成是樹(shù)形結(jié)構(gòu)的話,那么它主要角色有:
    1) 樹(shù)干角色(Component):該角色是一個(gè)抽象類,它定義了一些操作增刪樹(shù)葉(Leaf)的操作。
    2) 樹(shù)枝角色(Composite):樹(shù)枝上有很多樹(shù)干,樹(shù)枝也是樹(shù)干的一種。
    3) 樹(shù)葉角色(Leaf):樹(shù)干上的樹(shù)葉,也就是Component中的具體操作對(duì)象。
    說(shuō)到Composite模式,讓我想到以前項(xiàng)目中遇到的一個(gè)問(wèn)題,做一個(gè)影視節(jié)目列表的樹(shù)形結(jié)構(gòu),要求支持二級(jí)分類,由于當(dāng)時(shí)還沒(méi)接觸過(guò)設(shè)計(jì)模式,這個(gè)東西讓我搞了好久,才弄好。
    現(xiàn)在使用Composite模式來(lái)解決這個(gè)問(wèn)題,簡(jiǎn)直太簡(jiǎn)單了,別說(shuō)是二級(jí)了,N級(jí)都沒(méi)問(wèn)題。下面我就用Composite來(lái)實(shí)現(xiàn)它,代碼如下:
    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("貞觀長(zhǎng)歌");
      ConcreteMovieClass cmc=new ConcreteMovieClass("電視連續(xù)劇");//一級(jí)分類
      cmc.add(pro);
      cmc.add(pro2);
      Program pro3=new Program("滿城盡帶黃金甲");
      Program pro4=new Program("色戒");
      ConcreteMovieClass cmc2=new ConcreteMovieClass("最新影視");//一級(jí)分類
      cmc2.add(pro3);
      cmc2.add(pro4);
      Program pro5=new Program("越獄");
      Program pro6=new Program("英雄");
      ConcreteMovieClass secondCmc=new ConcreteMovieClass("熱播美劇");//二級(jí)分類
      secondCmc.add(pro5);
      secondCmc.add(pro6);
      cmc2.add(secondCmc);//在一級(jí)分類(最新影視)下添加二級(jí)分類熱播美劇
      ConcreteMovieClass root=new ConcreteMovieClass("root");
      root.add(cmc);
      root.add(cmc2);
      
      root.display();//顯示節(jié)目列表
      
     }
     
    }
    這個(gè)例子只是一個(gè)簡(jiǎn)單的模擬并不通用,在我們的實(shí)際應(yīng)用中,節(jié)目的來(lái)源(也就是Leaf)基本上都是從數(shù)據(jù)中讀出來(lái)放到一個(gè)javabean中,我們不可能讓這個(gè)bean來(lái)再來(lái)繼承我們的(Component),至少絕大部分情況是這樣,而且還要有很多操作要實(shí)現(xiàn),如判斷一個(gè)component是否是單個(gè)對(duì)象還是一個(gè)對(duì)象的組合,這個(gè)對(duì)象是否有子節(jié)點(diǎn)(Component),父節(jié)點(diǎn)(Component)以及異常處理等等。實(shí)現(xiàn)一個(gè)樹(shù)形菜單的通用程序并不是那么容易的事。由于大家對(duì)設(shè)計(jì)模式關(guān)注不是太高(我寫(xiě)了那么多設(shè)計(jì)模式的文章,連個(gè)拍磚的都沒(méi)有,傷心。。。。。。),以后有時(shí)間我再補(bǔ)上。
    Composite模式優(yōu)缺點(diǎn)及適用情況:
    1) 優(yōu)點(diǎn):使客戶端調(diào)用簡(jiǎn)單,客戶端可以一致的使用組合結(jié)構(gòu)或其中單個(gè)對(duì)象,用戶就不必關(guān)系自己處理的是單個(gè)對(duì)象還是整個(gè)組合結(jié)構(gòu),這就簡(jiǎn)化了客戶端代碼。
    2)缺點(diǎn):我覺(jué)得Leaf類完全不應(yīng)該來(lái)實(shí)現(xiàn)Component,應(yīng)為它基本只是使用一個(gè)顯示的作用,不能進(jìn)行其他的操作如添加、刪除等,如果實(shí)現(xiàn)Component容易產(chǎn)生誤操作。
    3)適用情況:比較適合做各種各樣的樹(shù)形菜單。


     

    Feedback

    # re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二十一)—Composite模式   回復(fù)  更多評(píng)論   

    2007-12-19 11:13 by 申少
    我也正在學(xué)習(xí)設(shè)計(jì)模式,謝謝你的文章。

    # re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二十一)—Composite模式   回復(fù)  更多評(píng)論   

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

    # re: 設(shè)計(jì)模式學(xué)習(xí)筆記(二十一)—Composite模式   回復(fù)  更多評(píng)論   

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

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

    Copyright © flustar

    主站蜘蛛池模板: 久久er国产精品免费观看2| 大学生美女毛片免费视频| 亚洲人色大成年网站在线观看| 24小时免费直播在线观看| 鲁啊鲁在线视频免费播放| 亚洲成AV人片一区二区| 手机在线看永久av片免费| japanese色国产在线看免费| 蜜芽亚洲av无码精品色午夜| 免费中文熟妇在线影片| GOGOGO免费观看国语| 亚洲字幕AV一区二区三区四区| 久久久精品国产亚洲成人满18免费网站 | 精品无码无人网站免费视频| 亚洲高清国产拍精品熟女| 国产成人亚洲综合无码精品| 好爽…又高潮了毛片免费看| 日韩a级无码免费视频| 亚洲国产精品精华液| 亚洲午夜久久久精品影院| 亚洲 小说区 图片区 都市| 免费在线观看视频网站| 成人国产精品免费视频| 亚洲精品美女久久久久久久| 亚洲一区精品中文字幕| 免费一级一片一毛片| 国产人在线成免费视频| 久久这里只精品国产免费10| 国产午夜亚洲精品不卡免下载| 亚洲理论片在线观看| 国产成A人亚洲精V品无码性色| 日韩亚洲国产综合久久久| 免费观看激色视频网站bd | 白白国产永久免费视频| 久久一本岛在免费线观看2020| 黄色毛片免费观看| 亚洲日韩中文字幕无码一区| 亚洲国产一区二区三区青草影视| 亚洲人成人无码网www国产| 日本免费无遮挡吸乳视频电影| 免费观看激色视频网站(性色)|