大话设计模式----组合模式

一、 组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

二、代码示例

@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();
    }
}

 

三、使用场景

  需求中是体现部分与整体层次的结构时,希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑使用组合模式。

posted @ 2020-04-10 23:02  Eden-programmer  阅读(131)  评论(0)    收藏  举报