組合模式
interface View{
void getBackground();
}
View頂層接口,隨便搞個(gè)獲取背景方法冻璃,不要在意沒有返回值哈哈
class TextView implements View{
public TextView(){
//迷人的無參構(gòu)造方法
}
public void getBackground(){
}
}
文字類,實(shí)現(xiàn)View接口损合。
class ImageView implements View{
public ImageView(){
//我也是個(gè)無參構(gòu)造函數(shù)
}
public void getBackground(){
}
}
圖片類省艳,實(shí)現(xiàn)View接口
class ViewGroup implements View{
private List<View> viewList = new ArrayList<View>();
public void addView(View view){
viewList.add(view);
}
public void deleteView(View view){
viewList.remove(view);
}
public void getBackground(){
for(View view : viewList){
view.getBackground();
}
}
}
ViewGroup類 ,容器構(gòu)件
class Client{
public static void main(String[] args){
View viewGroup,textView,imageView;
textView = new TextView();
imageView = new ImageView();
viewGroup = new ViewGroup();
viewGroup.add(textView);
viewGroup.add(imageView);
viewGroup.getBackground();
}
}
客戶端類
優(yōu)點(diǎn)
組合模式可以清楚地定義分層次的復(fù)雜對象嫁审,表示對象的全部或部分層次跋炕,它讓客戶端忽 略了層次的差異,方便對整個(gè)層次結(jié)構(gòu)進(jìn)行控制律适。
客戶端可以一致地使用一個(gè)組合結(jié)構(gòu)或其中單個(gè)對象辐烂,不必關(guān)心處理的是單個(gè)對象還是整 個(gè)組合結(jié)構(gòu),簡化了客戶端代碼捂贿。
在組合模式中增加新的容器構(gòu)件和葉子構(gòu)件都很方便纠修,無須對現(xiàn)有類庫進(jìn)行任何修改,符 合“開閉原則”厂僧。
組合模式為樹形結(jié)構(gòu)的面向?qū)ο髮?shí)現(xiàn)提供了一種靈活的解決方案分瘾,通過葉子對象和容器對 象的遞歸組合,可以形成復(fù)雜的樹形結(jié)構(gòu)吁系,但對樹形結(jié)構(gòu)的控制卻非常簡單德召。
缺點(diǎn)
在增加新構(gòu)件時(shí)很難對容器中的構(gòu)件類型進(jìn)行限制。有時(shí)候我們希望一個(gè)容器中只能有某些
特定類型的對象汽纤,例如在某個(gè)文件夾中只能包含文本文件上岗,使用組合模式時(shí),不能依賴類型
系統(tǒng)來施加這些約束蕴坪,因?yàn)樗鼈兌紒碜杂谙嗤某橄髮与戎溃谶@種情況下敬锐,必須通過在運(yùn)行時(shí)
進(jìn)行類型檢查來實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)過程較為復(fù)雜呆瞻。