将对象组合成属性结构以表示'部分-整体'的层次结构组合模式使得用户对单个对象和组合对象的使用具有一致性
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 + "正在发工资");
}
}
运行结果:
-总部
---东部分部
-----东部人力资源部
---西部分部
-----西部人力资源部
-----西部财务部部
---总部人力资源部
------------------------
总部为下属部门分配工作
东部分部为下属部门分配工作
东部人力资源部正在招收人才
西部分部为下属部门分配工作
西部人力资源部正在招收人才
西部财务部部正在招收人才
总部人力资源部正在招收人才