设计模式_15:组合模式

来源:互联网 发布:数据恢复 mac osx 编辑:程序博客网 时间:2024/06/06 02:09

将对象组合成属性结构以表示'部分-整体'的层次结构组合模式使得用户对单个对象和组合对象的使用具有一致性


import java.util.ArrayList;import java.util.List;public class Main {    public static void main(String[] args) {        Company topCompany = new ConcreteCompany("总部");        Company eastCompany = new ConcreteCompany("东部分部");        Company westCompany = new ConcreteCompany("西部分部");        topCompany.add(eastCompany);        topCompany.add(westCompany);        Company topHr = new HRDepartment("总部人力资源部");        Company eastHr = new HRDepartment("东部人力资源部");        Company westHr = new HRDepartment("西部人力资源部");        Company westFinance = new HRDepartment("西部财务部部");        topCompany.add(topHr);        eastCompany.add(eastHr);        westCompany.add(westHr);        westCompany.add(westFinance);        topCompany.display(1);        System.out.println("------------------------");        topCompany.work();    }}abstract class Company {    protected String name;    public Company(String name) {        this.name = name;    }    abstract void add(Company company);    abstract void remove(Company company);    abstract void display(int depth);    abstract void work();}//具体的公司或分部(非叶子结点)class ConcreteCompany extends Company{    private List<Company> companies = new ArrayList<>();    public ConcreteCompany(String name) {        super(name);    }    @Override    void add(Company company) {        companies.add(company);    }    @Override    void remove(Company company) {        companies.remove(company);    }    @Override    void display(int depth) {        for (int i=0; i<depth; i++){            System.out.print("-");        }        System.out.println(this.name);        for (Company company : companies){            company.display(depth + 2);        }    }    @Override    void work() {        System.out.println(this.name + "为下属部门分配工作");        for (Company company : companies){            company.work();        }    }}//人力资源部(叶子结点)class HRDepartment extends Company{    public HRDepartment(String name) {        super(name);    }    @Override    void add(Company company) {        System.out.println(this.name + "不能添加下属部门");    }    @Override    void remove(Company company) {        System.out.println(this.name + "不能添加下属部门");    }    @Override    void display(int depth) {        for (int i=0; i<depth; i++){            System.out.print("-");        }        System.out.println(this.name);    }    @Override    void work() {        System.out.println(this.name + "正在招收人才");    }}//财务部(叶子结点)class FinanceDepartment extends Company{    public FinanceDepartment(String name) {        super(name);    }    @Override    void add(Company company) {        System.out.println(this.name + "不能添加下属部门");    }    @Override    void remove(Company company) {        System.out.println(this.name + "不能添加下属部门");    }    @Override    void display(int depth) {        for (int i=0; i<depth; i++){            System.out.print("-");        }        System.out.println(this.name);    }    @Override    void work() {        System.out.println(this.name + "正在发工资");    }}

运行结果:

-总部---东部分部-----东部人力资源部---西部分部-----西部人力资源部-----西部财务部部---总部人力资源部------------------------总部为下属部门分配工作东部分部为下属部门分配工作东部人力资源部正在招收人才西部分部为下属部门分配工作西部人力资源部正在招收人才西部财务部部正在招收人才总部人力资源部正在招收人才


原创粉丝点击