组合模式(Composite)
将对象组合成树形结构以表示“部分-整体“的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
公司管理系统
公司:
public abstract class Company {
protected String name;
public Company(String name){
this.name = name;
}
public String getName() {
return name;
}
//添加部门或者公司
public abstract void addCompany(Company company);
//删除部门或者公司
public abstract void removeCompany(Company company);
//展示具体信息
public abstract void display(int num);
//展示职能
public abstract void displayDuty();
}
具体公司:
public class ConcreteCompany extends Company {
//存放该公司管理的部门或者分公司
private List<Company> list = new ArrayList<>();
public ConcreteCompany(String name){
super(name);
}
@Override
public void addCompany(Company company) {
list.add(company);
}
@Override
public void removeCompany(Company company) {
list.remove(company);
}
@Override
public void display(int num) {
System.out.println(this.name);
for (Company company : list) {
for(int i=0;i<num;i++){
System.out.print("-");
}
company.display(num+2);
}
}
@Override
public void displayDuty() {
for (Company company : list) {
company.displayDuty();
}
}
}
人事部门:
public class HrDepartment extends Company {
public HrDepartment(String name){
super(name);
}
@Override
public void addCompany(Company company) {
}
@Override
public void removeCompany(Company company) {
}
@Override
public void display(int num) {
System.out.println(this.name);
}
@Override
public void displayDuty() {
System.out.println(this.name+"-----"+"员工招聘管理");
}
}
财务部门
//财务部门
public class FinanceDepartment extends Company{
public FinanceDepartment(String name){
super(name);
}
@Override
public void addCompany(Company company) {
}
@Override
public void removeCompany(Company company) {
}
@Override
public void display(int num) {
System.out.println(this.name);
}
@Override
public void displayDuty() {
System.out.println(this.name+"---"+"财务管理职能");
}
}
测试:
public class Test {
public static void main(String[] args) {
ConcreteCompany root = new ConcreteCompany("上海总公司");
root.addCompany(new HrDepartment("总公司人力资源部"));
root.addCompany(new HrDepartment("总公司财务部"));
ConcreteCompany comp = new ConcreteCompany("北京分公司");
comp.addCompany(new HrDepartment("北京分公司人力资源部"));
comp.addCompany(new HrDepartment("北京分公司财务部"));
root.addCompany(comp);
ConcreteCompany comp1 = new ConcreteCompany("南京办事处");
comp1.addCompany(new HrDepartment("南京办事处人力资源部"));
comp1.addCompany(new HrDepartment("南京办事处财务部"));
comp.addCompany(comp1);
ConcreteCompany comp2 = new ConcreteCompany("苏州办事处");
comp2.addCompany(new HrDepartment("苏州办事处人力资源部"));
comp2.addCompany(new HrDepartment("苏州办事处财务部"));
comp.addCompany(comp2);
System.out.println("-----------展示公司结构-----------");
root.display(2);
System.out.println("----------展示职能-------------");
root.displayDuty();
}
}
上海总公司
--总公司人力资源部
--总公司财务部
--北京分公司
----北京分公司人力资源部
----北京分公司财务部
----南京办事处
------南京办事处人力资源部
------南京办事处财务部
----苏州办事处
------苏州办事处人力资源部
------苏州办事处财务部
----------展示职能-------------
总公司人力资源部-----员工招聘管理
总公司财务部-----员工招聘管理
北京分公司人力资源部-----员工招聘管理
北京分公司财务部-----员工招聘管理
南京办事处人力资源部-----员工招聘管理
南京办事处财务部-----员工招聘管理
苏州办事处人力资源部-----员工招聘管理
苏州办事处财务部-----员工招聘管理