我的漫漫程序之旅

          專注于JavaWeb開發
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
          數據加載中……

          設計模式之Composite(組合)

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

          Composite比較容易理解,想到Composite就應該想到樹形結構圖。組合體內這些對象都有共同接口,當組合體一個對象的方法被調用執行時,Composite將遍歷(Iterator)整個樹形結構,尋找同樣包含這個方法的對象并實現調用執行。可以用牽一動百來形容。

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

          Composite好處:
          1.使客戶端調用簡單,客戶端可以一致的使用組合結構或其中單個對象,用戶就不必關系自己處理的是單個對象還是整個組合結構,這就簡化了客戶端代碼。
          2.更容易在組合體內加入對象部件. 客戶端不必因為加入了新的對象部件而更改代碼。

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


          Composite分為三個角色:

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

          2.Leaf
          樹形結構的葉節點。Component的實現子類

          3.Composite
          樹形結構的枝節點。Component的實現子類


          Composite分為:

          1 透明式

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

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

           

          安全式的實現:

          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();
                  }

              }


          }


          現在寫個測試類來測試:

           

           

          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)  編輯  收藏 所屬分類: 設計模式

          主站蜘蛛池模板: 红河县| 邛崃市| 邵东县| 平罗县| 安乡县| 古蔺县| 青海省| 江油市| 施秉县| 龙陵县| 五峰| 柏乡县| 天长市| 将乐县| 长治市| 视频| 时尚| 会泽县| 东平县| 和平区| 木里| 淮滨县| 连城县| 页游| 亳州市| 疏附县| 炉霍县| 卢龙县| 张家界市| 宁河县| 安陆市| 沙河市| 长沙县| 青铜峡市| 龙游县| 聊城市| 花垣县| 汕头市| 阳西县| 洪雅县| 资阳市|