我的漫漫程序之旅

          專注于JavaWeb開發(fā)
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
          數(shù)據(jù)加載中……

          設(shè)計模式之Composite(組合)

          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),尋找同樣包含這個方法的對象并實現(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)加入對象部件. 客戶端不必因為加入了新的對象部件而更改代碼。

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


          Composite分為三個角色:

          1.Component
          樹形結(jié)構(gòu)的節(jié)點抽象
          - 為所有的對象定義統(tǒng)一的接口(公共屬性,行為等的定義)
          - 提供管理子節(jié)點對象的接口方法
          - [可選]提供管理父節(jié)點對象的接口方法

          2.Leaf
          樹形結(jié)構(gòu)的葉節(jié)點。Component的實現(xiàn)子類

          3.Composite
          樹形結(jié)構(gòu)的枝節(jié)點。Component的實現(xiàn)子類


          Composite分為:

          1 透明式

           添加Component對象的操作定義在Component角色中,這樣的話不僅Composite需要實現(xiàn)這些方法,Leaf也需要實現(xiàn)這些方法,
           而這些方法對于Leaf來說沒有任何意義,不過將系統(tǒng)實現(xiàn)統(tǒng)一起來了,因此對用戶來說透明(用戶無需區(qū)分Composite還是Leaf)
           ,因為這些角色中都具備這些方法。
           
          2 安全式

           添加Component對象的操作定義在Composite角色中,這樣的話Leaf就無需實現(xiàn)這些方法(因為Leaf本身根本不需要實現(xiàn)這些方法)

           

          安全式的實現(xiàn):

          1.抽象角色:

          package com.composite;
          /***
           * 抽象角色
           * 
          @author zdw
           *
           
          */

          public interface Component
          {
              
          void doAction();
          }


          2.葉子角色:

          package com.composite;

          /**
           * 葉子角色
           * 
           * 
          @author zdw
           * 
           
          */

          public class Leaf implements Component
          {

              @Override
              
          public void doAction()
              
          {
                  System.out.println(
          "Leaf do Action");
              }


          }

          3.Comosite角色

          package com.composite;

          import java.util.ArrayList;
          import java.util.List;

          /**
           * Composite角色
           * 
           * 
          @author zdw
           * 
           
          */

          public class Composite implements Component
          {
              
          private List<Component> list = new ArrayList<Component>();

              
          public void addComponent(Component component)
              
          {
                  
          if (!list.contains(component))
                  
          {
                      list.add(component);
                  }

              }


              
          public void removeComonent(Component component)
              
          {
                  
          if (list.contains(component))
                  
          {
                      list.remove(component);
                  }

              }


              
          public List<Component> getAllComponents()
              
          {
                  
          return list;
              }


              @Override
              
          public void doAction()
              
          {
                  
          for (Component com : list)
                  
          {
                      com.doAction();
                  }

              }


          }


          現(xiàn)在寫個測試類來測試:

           

           

          package com.composite;

          public class Client
          {
              
          public static void main(String[] args)
              
          {
                  Component leaf1 
          = new Leaf();
                  Component leaf2 
          = new Leaf();

                  Composite composite 
          = new Composite();
                  composite.addComponent(leaf1);
                  composite.addComponent(leaf2);
                  composite.doAction();
              }

          }


          對于透明模式只需要把add()或remove等方法,寫個抽象角色接口里面就行了.

          void add();
          void remove();


          posted on 2008-05-17 11:06 々上善若水々 閱讀(818) 評論(0)  編輯  收藏 所屬分類: 設(shè)計模式

          主站蜘蛛池模板: 沙河市| 武邑县| 建德市| 黑水县| 永年县| 邻水| 宜阳县| 昭苏县| 普陀区| 弥勒县| 镇赉县| 固原市| 都安| 昌图县| 莆田市| 上栗县| 七台河市| 武城县| 峡江县| 吉首市| 莱州市| 海宁市| 灵丘县| 五家渠市| 张掖市| 扶沟县| 桐乡市| 蒲城县| 共和县| 城口县| 青岛市| 新晃| 东乡县| 彝良县| 太湖县| 垫江县| 环江| 湖州市| 贵溪市| 鹿邑县| 上林县|