1 介紹
小白:大哥。我被我老媽罵了霎匈。/(ㄒoㄒ)/~~
Acey:為什么呀戴差?
小白:因為我昨天用完《多色按壓筆》后到處亂扔。 ,,???,,
Acey:活該铛嘱。 ε=( o`ω′)ノ
小白:.......暖释,不過罵完我之后,她還給我買了個筆盒墨吓。 O(∩_∩)O
Acey:咳咳饭入,好騷氣的筆盒,還是多層的肛真。你媽真會選。不過看到這個筆盒我又想起了組合模式爽航,想不想知道是怎么回事呀蚓让?
小白:,好像沒的選吧讥珍。您老說吧历极。不過得講的我聽的懂才行哦。
Acey:No problem衷佃!
組合模式:又叫部分整體模式趟卸,是構造型模式的一種,是用于將一組類似的對象當做一個單個對象氏义,然后根據(jù)樹形結構組合對象锄列。
Acey:先來簡單的解釋一下吧」哂疲看你都要睡著了邻邮。。
小白: 好哇克婶。
Acey:多種顏色的筆或筆盒的每一層就相當于一組類似的對象筒严,而根據(jù)樹狀結構組合對象就是將每一層當作樹枝,筆當作樹葉來組合起來情萤,從而形成一棵樹狀結構鸭蛙。
組合模式的幾個角色:
- Component(枝干):提供管理子節(jié)點對象的接口方法。
- Composite(樹枝):Component的實現(xiàn)類筋岛。
- Leaf(葉子):Component的實現(xiàn)類娶视。
小白:額,
能來個實例就好了泉蝌?
Acey:好吧歇万,下面我們就來寫個小demo吧揩晴。
2 實現(xiàn)
第一步,先把筆盒接口創(chuàng)建出來
PenBox.class
public interface PenBox {
//添加一層或往當前層添加筆
public void add(PenBox penbox);
//移除當前層或移除當前層中存放的筆
public void remove(PenBox penbox);
//查看當前層或當前層中的筆
public void display();
//獲取筆盒中的所有層或當前層中的所有筆
public List<PenBox> getChildren();
}
第二步贪磺,創(chuàng)建一個筆盒層對象
Layer.class
public class Layer implements PenBox{
private List<PenBox> layers;
private String name;
//給當前層一個名字
public Layer(String name) {
layers = new ArrayList<>();
this.name = name;
}
//給當前層添加一支筆
@Override
public void add(PenBox penbox) {
layers.add(penbox);
}
//移除當前層中的一支筆
@Override
public void remove(PenBox penbox) {
layers.remove(penbox);
}
//顯示當前層的名稱
@Override
public void display() {
System.out.println(name);
}
//獲取當前層中的所有筆
@Override
public List<PenBox> getChildren() {
return this.layers;
}
}
第三步硫兰,創(chuàng)建筆對象
Pen.class
public class Pen implements PenBox{
private String name;
public Pen(String name) {
this.name = name;
}
@Override
public void add(PenBox penbox) {
}
@Override
public void remove(PenBox penbox) {
}
//顯示當前筆
@Override
public void display() {
System.out.println(name);
}
@Override
public List<PenBox> getChildren() {
return null;
}
}
測試:MainClass.class
public class MainClass {
public static void main(String[] args) {
//創(chuàng)建一個筆盒,筆盒是一個特殊的層
PenBox penBox = new Layer("筆盒");
//為筆盒添加兩層
PenBox penLayer = new Layer("第一層寒锚,裝中性筆");
PenBox pencilLayer = new Layer("第二層劫映,裝鉛筆");
//將第一層和第一層添加到筆盒中
penBox.add(penLayer);
penBox.add(pencilLayer);
//向鉛筆層中添加三支筆
pencilLayer.add(new Pen("紅色"));
pencilLayer.add(new Pen("白色"));
pencilLayer.add(new Pen("藍色"));
//向中性筆層中添加三支筆
penLayer.add(new Pen("紅色"));
penLayer.add(new Pen("白色"));
penLayer.add(new Pen("藍色"));
//顯示筆盒中全部的筆
display(penBox, 0);
}
//迭代打印整個筆盒
public static void display(PenBox penbox,Integer deep){
for(int i = 0; i < deep; ++i){
System.out.print("-");
}
penbox.display();
if(penbox instanceof Pen){
return;
}
List<PenBox> children = penbox.getChildren();
for(PenBox child : children){
if(child instanceof Pen){
for(int i = 0; i <= deep; ++i){
System.out.print("-");
}
child.display();
}else{
display(child, deep+1);
}
}
}
}
Acey:看,我們可以用遞歸將整個筆盒的結構輸出出來刹前,可以看到我們將筆盒分成了兩層泳赋。當然如果你還想加層的話也可以哦。
小白:soga喇喉,那可以在某一層中再加一層嘛祖今。??
Acey:可以啊,如果你想放什么小秘密的話拣技,也可以再在某一層中添加一層千诬。就像大樹的枝葉一樣可以無限延伸。
3 特點
高層調(diào)用底層模塊簡單膏斤,而且子節(jié)點可以自由增加徐绑。適合用于部分、整體設計莫辨,如菜單傲茄,文件、文件夾等沮榜。
Acey:小白盘榨,你沒睡著吧。
小白:肯定沒有哇蟆融。待我在下去消化一下较曼。哈哈
喜歡的話戳一下喜歡唄。
有什么建議的話希望大家能在下方回復('')
上一篇:外觀模式 - 多色按壓筆你使過沒振愿?
下一篇:橋接模式 - 大/小白祝大家元旦Glücklich