一、定义
形成树状的层次管理结构图,并且每个节点都具有相同的功能。
将对象组合成树形结构以表示部分-整体的的层次结构。组合模式是的用户对单个对象和组合对象的使用具有一致性。
二、代码实例
-
需求
在大公司建立管理系统,旗下有多个分公司,都需要建立同样的管理系统,需要在有层级关系的情况下,对管理系统的代码进行复用。
-
代码实现
抽象公司类:
public abstract class Company { private String name; public Company(String name) { this.name = name; } public String getName() { return name; } //添加 public abstract void add(Company company); //移除 public abstract void remove(Company company); //展示 public abstract void display(int depth); //履行职责 public abstract void lineOfDuty(); }
具体公司类:
public class ConcreteCompany extends Company { private List<Company> companies = new ArrayList<>(); public ConcreteCompany(String name) { super(name); } @Override public void add(Company company) { this.companies.add(company); } @Override public void remove(Company company) { this.companies.remove(company); } @Override public void display(int depth) { StringBuilder s = new StringBuilder(); for (int i = 0;i < depth;i++) { s.append("-"); } System.out.println(s.toString() + super.getName()); for (Company company : companies) { company.display(depth + 2); } } @Override public void lineOfDuty() { for (Company company : companies) { company.lineOfDuty(); } } }
财务部类:
public class FinanceDepartment extends Company { public FinanceDepartment(String name) { super(name); } @Override public void add(Company company) { } @Override public void remove(Company company) { } @Override public void display(int depth) { StringBuilder s = new StringBuilder(); for (int i = 0;i < depth;i++) { s.append("-"); } System.out.println(s.toString() + super.getName()); } @Override public void lineOfDuty() { System.out.println(super.getName() + " 公司财政收支管理"); } }
人力资源部类:
public class HrDepartment extends Company { public HrDepartment(String name) { super(name); } @Override public void add(Company company) { } @Override public void remove(Company company) { } @Override public void display(int depth) { StringBuilder s = new StringBuilder(); for (int i = 0;i < depth;i++) { s.append("-"); } System.out.println(s.toString() + super.getName()); } @Override public void lineOfDuty() { System.out.println(super.getName() + " 员工招聘培训管理"); } }
测试类:
public class Test { public static void main(String[] args) { ConcreteCompany root = new ConcreteCompany("北京总公司"); root.add(new HrDepartment("总公司人力资源部")); root.add(new FinanceDepartment("总公司财务部")); ConcreteCompany company1 = new ConcreteCompany("上海华东分公司"); company1.add(new HrDepartment("华东分公司人力资源部")); company1.add(new FinanceDepartment("华东分公司财务部")); root.add(company1); ConcreteCompany company2 = new ConcreteCompany("南京办事处"); company2.add(new HrDepartment("南京办事处人力资源部")); company2.add(new FinanceDepartment("南京办事处财务部")); company1.add(company2); ConcreteCompany company3 = new ConcreteCompany("杭州办事处"); company3.add(new HrDepartment("杭州办事处人力资源部")); company3.add(new FinanceDepartment("杭州办事处财务部")); company1.add(company3); System.out.println("结构图:"); root.display(1); System.out.println("职责:"); root.lineOfDuty(); } }
微信扫一扫
关注该公众号