核心思想
- 組合模式可以使用一棵樹來(lái)表示
- 組合模式使得用戶可以使用一致的方法操作單個(gè)對(duì)象和組合對(duì)象
- 組合模式又叫部分整體模式,將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),可以更好的實(shí)現(xiàn)管理操作,部分-整體對(duì)象的操作基本一樣,但是應(yīng)該還會(huì)有不一樣的地方
場(chǎng)景使用
- 比如文件夾和文件,都有增加、刪除等api,也有層級(jí)管理關(guān)系
- 比如公司,總公司下有子公司,每個(gè)公司的部門都類似
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-688175.html
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 方便創(chuàng)建出復(fù)雜的層次結(jié)構(gòu)
- 客戶端只需要面對(duì)一致的對(duì)象而不用考慮整體部分的問題
缺點(diǎn)
- 需要花更多的時(shí)間理清類之間的層次關(guān)系
代碼示例
根節(jié)點(diǎn)(抽象類-Component)
public abstract class Root {
private String name;
public Root(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void addFile(Root root);
public abstract void removeFile(Root root);
public abstract void display(int depth);
}
具體文件夾類(Composite)
public class Folder extends Root {
private List<Root> folders = new ArrayList<>();
public Folder(String name) {
super(name);
}
public List<Root> getFolders() {
return folders;
}
public void setFolders(List<Root> folders) {
this.folders = folders;
}
@Override
public void addFile(Root root) {
folders.add(root);
}
@Override
public void removeFile(Root root) {
folders.remove(root);
}
@Override
public void display(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append("-");
}
//打印橫線和當(dāng)前文件名
System.out.println(sb.toString() + this.getName());
for (Root r : folders) {
//每個(gè)下級(jí)
r.display(depth + 1);
}
}
}
具體的文件(Leaf)
public class File extends Root {
public File(String name) {
super(name);
}
@Override
public void addFile(Root root) {
}
@Override
public void removeFile(Root root) {
}
@Override
public void display(int depth) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < depth; i++) {
sb.append("-");
}
//打印橫線和當(dāng)前文件名
System.out.println(sb.toString() + this.getName());
}
}
測(cè)試
public class AppRun {
public static void main(String[] args) {
//創(chuàng)造根?件夾
Root root1 = new Folder("root");
//建???件
Root comp1 = new Folder("Composite1");
Root comp2 = new Folder("Composite2");
//建??件夾關(guān)系
root1.addFile(comp1);
root1.addFile(comp2);
//建??件關(guān)系
comp1.addFile(new File("leafA"));
comp2.addFile(new File("leafB"));
//展示
root1.display(1);
}
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-688175.html
到了這里,關(guān)于設(shè)計(jì)模式-組合模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!