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


           

          Feedback

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

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

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

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

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

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

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

          Copyright © flustar

          主站蜘蛛池模板: 金塔县| 凤山县| 白河县| 奉化市| 永康市| 正镶白旗| 建水县| 唐海县| 濮阳县| 扎赉特旗| 新乡市| 集安市| 湖南省| 万山特区| 大同县| 岐山县| 井研县| 汶上县| 商都县| 洛川县| 呼玛县| 长武县| 安平县| 密云县| 宜章县| 高碑店市| 洪湖市| 榆林市| 永济市| 舟曲县| 长海县| 长春市| 新邵县| 壶关县| 东辽县| 长海县| 阿克陶县| 开封市| 淮北市| 乐亭县| 冷水江市|