JUNIT源碼探秘(六):Junit代碼分析之組合模式
在面向過程的編程中,類似于樹形結(jié)構(gòu)或者文件目錄結(jié)構(gòu),一般使用遞歸的方式進行處理,而在面向過程中,對于這類問題抽象處理為組合模式。
組合模式(Composite Pattern)有時候又叫做部分-整體模式,它在處理樹型結(jié)構(gòu)的問題中,模糊了簡單元素和復雜元素的概念,客戶程序可以向處理簡單元素一樣來處理復雜元素,從而使得客戶程序與復雜元素的內(nèi)部結(jié)構(gòu)解耦。組合模式讓你可以優(yōu)化處理遞歸或分級數(shù)據(jù)結(jié)構(gòu)。
對于組合模式的角色也比較簡單,我們試著對文件目錄結(jié)構(gòu)進行分析,在文件目錄結(jié)構(gòu)中至少有兩種結(jié)構(gòu),一種是文件,一種是目錄。對于這兩個角色大的區(qū)別是,一個是葉子節(jié)點,一個是樹枝結(jié)構(gòu)。那么也可以把這兩個對象抽象成一個接口類。這樣分析后文件目錄結(jié)構(gòu)有三個角色,即葉子(葉子組件),樹枝 (組合組件),抽象結(jié)構(gòu)(抽象構(gòu)件接口)。下面對每個角色具體分析
抽象構(gòu)件角色(Component):它為組合中的對象聲明接口,也可以為共有接口實現(xiàn)缺省行為。
樹葉構(gòu)件角色(Leaf):在組合中表示葉節(jié)點對象——沒有子節(jié)點,實現(xiàn)抽象構(gòu)件角色聲明的接口。
樹枝構(gòu)件角色(Composite):在組合中表示分支節(jié)點對象——有子節(jié)點,實現(xiàn)抽象構(gòu)件角色聲明的接口;存儲子部件。
Client(客戶端)
–通過Component接口控制組合部件的對象
各個角色之間關系如下:
如圖上圖所示:一個Composite實例可以像一個簡單的Leaf實例一樣,可以把它傳遞給任何使用Component的方法或者對象,并且它表現(xiàn)的像是一個Leaf一樣。使用組合模式使得這個設計結(jié)構(gòu)非常靈活。
各個角色代碼實現(xiàn)如下:
抽象構(gòu)件角色(Component):
public interface Component
{
public void doSomething();
}
樹葉構(gòu)件角色(Leaf):
public class Leaf implements Component
{
@Override
public void doSomething()
{
System.out.println("執(zhí)行方法");
}
}
樹枝構(gòu)件角色(Composite):
public class Composite implements Component
{
private List list = newArrayList();
public void add(Component component)
{
list.add(component);
}
public void remove(Component component)
{
list.remove(component);
}
public List getAll()
{
return this.list;
}
public void doSomething()
{
for(Component component : list)
{
component.doSomething();
}
}
}