设计模式_15:组合模式

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


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 + "正在发工资");
    }
}

运行结果:

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值