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