設計模式之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分為:
package com.composite;
/***
* 抽象角色
* @author zdw
*
*/
public interface Component
{
void doAction();
}
package com.composite;

/**
* 葉子角色
*
* @author zdw
*
*/
public class Leaf implements Component
{

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

}
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();
}
}
void add();
void remove();
將對象以樹形結構組織起來,以達成“部分-整體” 的層次結構,使得客戶端對單個對象和組合對象的使用具有一致性.
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.抽象角色:











2.葉子角色:



















3.Comosite角色















































現在寫個測試類來測試:















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



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