設計模式11 組合模式

2021-09-26 07:08:23 字數 2807 閱讀 2023

還是餐廳,多個餐廳合併,每個餐廳的選單實現方式不一樣,有的為arraylist有的為array.

參見:10迭代器模式

增加餐後甜點子選單,需要改子選單和原選單列表中的選單項同級.

原選單列表中都為menuitem,而現在還要增加子選單.

要求如下:

[外鏈轉存失敗(img-altdnffq-1566140566608)(

可以讓選單和子選單繼承某乙個超類,該超類有自己的迭代器.

[外鏈轉存失敗(img-whut5p25-1566140566609)(

public abstract class menucomponent 

public string getdescription()

public float getprice()

public boolean isvegetable()

public abstract void print();

public iterator getiterator()

}public class menuitem extends menucomponent

@override

public string getname()

@override

public string getdescription()

@override

public float getprice()

@override

public boolean isvegetable()

@override

public void print()

}public class submenu extends menucomponent

private void additem(string name, string description, boolean vegetable,

float price)

public iterator getiterator()

@override

public void print()

}

public class composeiterator implements iterator 

@override

public boolean hasnext()

iterator iterator = stack.peek();

if (!iterator.hasnext()) else

} @override

public object next()

return null;

} @override

public void remove()

}public class nulliterator implements iterator

@override

public object next()

@override

public void remove()

}

public class cakehousemenu extends menucomponent 

private void additem(string name, string description, boolean vegetable,

float price)

public iterator getiterator()

@override

public void print()

}public class dinermenu extends menucomponent

private void additem(string name, string description, boolean vegetable,

float price) else

} private void addsubmenu(menucomponent mmenucomponent) else

} public iterator getiterator()

class dineriterator implements iterator

@override

public boolean hasnext()

return false;

} @override

public object next()

@override

public void remove()

} @override

public void print()

}

public class menucontrol 

public void addcomponent(menucomponent mmenucomponent)

//列印所有選單

public void printmenu()

} }public void printbreakfastmenu()

public void printlunchmenu()

public void printvegetablemenu()

}} }

}public class composetest

}

*** 組合模式:*** 將物件聚合成樹形結構來表現「整體/部分」的層次結構。

組合模式能讓客戶以一致的方式來處理個別物件以及物件組合。也就是我們可以忽略物件組合與個體物件之間的差別

設計模式11 組合模式

組合模式有時又叫部分 整體模式在處理類似樹形結構的問題時比較方便 分支類public class treenode public string getname public void setname string name public treenode getparent public void ...

設計模式8 組合模式

組合模式首先想到的就是樹形結構,比如我們常用的檔案結構,請看windows的檔案結構 無論是檔案或者是資料夾,常用操作都是一致的,比如 複製 貼上 剪下 刪除 所佔空間大小。我們並沒有刻意的去分他是資料夾還是檔案。我們可以把資料夾看成是組合物件,把每乙個檔案看成是單個物件。組合模式模糊了這兩個概念,...

《設計模式12 組合模式

組合模式其實是乙個很形象的模式。它也被稱為部分整體模式。組合模式的結構就如同樹狀圖一樣。而樹就是枝幹 葉子的組合,組合模式可以形象的這麼理解。其實資料夾是乙個很好的組合模式的體現。乙個資料夾 樹根root 下可能有多個資料夾 枝幹trunk 可能是單個的檔案 樹葉leaf 而枝幹是可以繼續向下延伸的...