組合模式
組合UML.png
interface View{
void getBackground();
}
View頂層接口,隨便搞個獲取背景方法,不要在意沒有返回值哈哈
class TextView implements View{
public TextView(){
//迷人的無參構造方法
}
public void getBackground(){
}
}
文字類,實現View接口。
class ImageView implements View{
public ImageView(){
//我也是個無參構造函數
}
public void getBackground(){
}
}
圖片類,實現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類 ,容器構件
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();
}
}
客戶端類
優點
組合模式可以清楚地定義分層次的復雜對象,表示對象的全部或部分層次,它讓客戶端忽 略了層次的差異,方便對整個層次結構進行控制。
客戶端可以一致地使用一個組合結構或其中單個對象,不必關心處理的是單個對象還是整 個組合結構,簡化了客戶端代碼。
在組合模式中增加新的容器構件和葉子構件都很方便,無須對現有類庫進行任何修改,符 合“開閉原則”。
組合模式為樹形結構的面向對象實現提供了一種靈活的解決方案,通過葉子對象和容器對 象的遞歸組合,可以形成復雜的樹形結構,但對樹形結構的控制卻非常簡單。
缺點
在增加新構件時很難對容器中的構件類型進行限制。有時候我們希望一個容器中只能有某些
特定類型的對象,例如在某個文件夾中只能包含文本文件,使用組合模式時,不能依賴類型
系統來施加這些約束,因為它們都來自于相同的抽象層,在這種情況下,必須通過在運行時
進行類型檢查來實現,這個實現過程較為復雜。