大话设计模式----组合模式
一、 组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
二、代码示例
@Data public abstract class Company { protected String name; public Company(String name) { this.name = name; } public abstract void add(Company c); public abstract void remove(Company c); public abstract void display(int depth); public abstract void lineOfDuty(); } public class ConcreteCompany extends Company { private List<Company> children = new ArrayList<>(); public ConcreteCompany(String name) { super(name); } @Override public void add(Company c) { children.add(c); } @Override public void remove(Company c) { children.remove(c); } @Override public void display(int depth) { StringBuilder ch = new StringBuilder(); for (int i = 0; i < depth; i++) { ch.append("-"); } System.out.println(ch.toString() + name); children.forEach(c ->{ c.display(depth + 2); }); } @Override public void lineOfDuty() { children.forEach(Company::lineOfDuty); } } public class FinanceDepartment extends Company { public FinanceDepartment(String name) { super(name); } @Override public void add(Company c) { } @Override public void remove(Company c) { } @Override public void display(int depth) { StringBuilder ch = new StringBuilder(); for (int i = 0; i < depth; i++) { ch.append("-"); } System.out.println(ch.toString() + name); } @Override public void lineOfDuty() { System.out.println(name + "员工招聘培训管理"); } } public class HrDepartment extends Company { public HrDepartment(String name) { super(name); } @Override public void add(Company c) { } @Override public void remove(Company c) { } @Override public void display(int depth) { StringBuilder ch = new StringBuilder(); for (int i = 0; i < depth; i++) { ch.append("-"); } System.out.println(ch.toString() + name); } @Override public void lineOfDuty() { System.out.println(name + "员工招聘培训管理"); } } public class Test { public static void main(String[] args) { ConcreteCompany root = new ConcreteCompany("北京总公司"); root.add(new HrDepartment("总公司人力资源部")); root.add(new FinanceDepartment("总公司财务部")); ConcreteCompany comp = new ConcreteCompany("上海华东分公司"); comp.add(new HrDepartment("上海华东分公司人力资源部")); comp.add(new FinanceDepartment("上海华东分公司财务部")); ConcreteCompany comp2 = new ConcreteCompany("南京办事处"); comp2.add(new HrDepartment("南京办事处人力资源部")); comp2.add(new FinanceDepartment("南京办事处财务部")); root.add(comp); root.add(comp2); System.out.println("结构图:"); root.display(1); System.out.println("职责:"); root.lineOfDuty(); } }
三、使用场景
需求中是体现部分与整体层次的结构时,希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式。

浙公网安备 33010602011771号