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

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

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

    我的漫漫程序之旅

    專注于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 々上善若水々 閱讀(813) 評論(0)  編輯  收藏 所屬分類: 設計模式

    主站蜘蛛池模板: 亚洲一区二区三区免费观看| 亚洲av无码无在线观看红杏| 亚洲人成网站看在线播放| 男的把j放进女人下面视频免费| 亚洲中文字幕成人在线| 黄页网址大全免费观看12网站| 免费萌白酱国产一区二区| 国产AV日韩A∨亚洲AV电影| 国产免费人视频在线观看免费| 精品成人一区二区三区免费视频| 国产片免费福利片永久| 国产精品亚洲综合网站| 亚洲精品第一国产综合精品99| 一级毛片免费不卡直观看| 亚洲线精品一区二区三区| 国产在线观看免费视频软件| 亚洲一区二区在线视频| 希望影院高清免费观看视频| 亚洲人成色77777在线观看| 国产精品va无码免费麻豆| 无码毛片一区二区三区视频免费播放| 亚洲色图综合在线| 三年片在线观看免费大全电影| 亚洲乱码一二三四区麻豆| 国产a级特黄的片子视频免费| 看全免费的一级毛片| 国产亚洲精品a在线观看app| 91精品全国免费观看含羞草| 亚洲精品无播放器在线播放| 国产偷国产偷亚洲高清日韩| 91福利视频免费观看| 亚洲欧美在线x视频| 亚洲成AV人片一区二区密柚| 亚洲中文无码永久免费| 一本大道一卡二大卡三卡免费| 久久亚洲美女精品国产精品 | 亚洲精品在线视频观看| 成人免费视频软件网站| 美女无遮挡拍拍拍免费视频| 亚洲午夜电影在线观看| 国产日产亚洲系列最新|