組合模式:把類似對(duì)象或方法組合成結(jié)構(gòu)為樹狀的設(shè)計(jì)思路。
例如部門之間的關(guān)系。
設(shè)計(jì)模式,一定要敲代碼理解
抽象組件
/**
* @author ggbond
* @date 2024年04月06日 08:54
* 部門有:二級(jí)部門(下面管三級(jí)部門) 三級(jí)部門 (無(wú)子部門)
*/
public abstract class Compound {
private String name; // 部門
public Compound(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract void add(Compound component); // 添加子部門
public abstract void remove(Compound component); // 刪除子部門
public abstract void select(int depth); // 查看全部子部門
}
葉子結(jié)點(diǎn)
/**
* @author ggbond
* @date 2024年04月06日 08:57
* 葉子節(jié)點(diǎn) 三級(jí)部門
*/
public class Leaf extends Compound {
public Leaf(String name) {
super(name);
}
@Override
public void add(Compound component) {
System.out.println("不能加子部門");
}
@Override
public void remove(Compound component) {
System.out.println("無(wú)子部門,無(wú)刪除權(quán)限");
}
@Override
public void select(int depth) {
//輸出樹形結(jié)構(gòu)的葉子節(jié)點(diǎn),這里直接輸出設(shè)備名稱
for(int i = 0; i < depth; i++) {
System.out.print("*");
}
System.out.print(" ");
System.out.println(getName());
}
}
非葉子結(jié)點(diǎn)
/**
* @author ggbond
* @date 2024年04月06日 09:00
*/
public class Composite extends Leaf{
// 記錄子部門信息
private ArrayList<Compound> list = new ArrayList<>();
public Composite(String name) {
super(name);
}
@Override
public void add(Compound component) {
list.add(component);
}
@Override
public void remove(Compound component) {
list.remove(component);
}
@Override
public void select(int depth) {
for (int i = 0; i < depth; i++) {
System.out.print("*");
}
System.out.print(" ");
System.out.println(getName());
// 遞歸
for(Compound compound: list) {
compound.select(depth + 1);
}
}
}
測(cè)試結(jié)果
/**
* @author ggbond
* @date 2024年04月06日 09:04
*/
public class Main {
public static void main(String[] args) {
Composite root=new Composite("一級(jí)部門1");
//二級(jí)部門1
Composite r21=new Composite("二級(jí)部門1");
r21.add(new Composite("三級(jí)部門1"));
r21.add(new Composite("三級(jí)部門2"));
r21.add(new Composite("三級(jí)部門3"));
//二級(jí)部門2
Composite r22=new Composite("二級(jí)部門2");
r22.add(new Composite("三級(jí)部門4"));
r22.add(new Composite("三級(jí)部門5"));
r22.add(new Composite("三級(jí)部門6"));
//二級(jí)部門3
Composite r23=new Composite("二級(jí)部門3");
root.add(r21); root.add(r22); root.add(r23);
root.select(1);
}
}
* 一級(jí)部門1
** 二級(jí)部門1
*** 三級(jí)部門1
*** 三級(jí)部門2
*** 三級(jí)部門3
** 二級(jí)部門2
*** 三級(jí)部門4
*** 三級(jí)部門5
*** 三級(jí)部門6
** 二級(jí)部門3
總結(jié)
滿足開閉原則。葉子結(jié)點(diǎn)與非葉子結(jié)點(diǎn)都繼承或?qū)崿F(xiàn)同一抽象,只是葉子功能權(quán)限少,而非葉子結(jié)點(diǎn)需要容器記錄子節(jié)點(diǎn)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-847925.html
代碼下載
代碼下載文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-847925.html
到了這里,關(guān)于設(shè)計(jì)模式——組合模式08的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!