分公司=一个部门
- 概念
- 类图
- 代码实例
概念
分公司=一个部分 把分公司看成一个部门,而分公司又可以有其他分公司和部门 …,这里介绍一种适合这种场景的设计模式那就是组合模式。
组合模式:将对象组合成树形结构以表示 部分-整体的层次结构。组合模式使用户对单个对象和组合对象的使用具有一致性。
类图
Company:公司的抽象类(Component)
ConcreteCompany:具体公司类 相当于树的分支(Composite)
HRDepartment:hr部门 相当于树的叶子没有其他分支类(Leaf)
FinanceDepartment:财政部门 (Leaf)
Client:客户端测试
代码实力
Company 抽象公司类
/**
* @author duanyimiao
* @create 2018-10-14 9:41 AM
* @description 抽象公司类或接口
**/
public abstract class Company {
protected String name;
public Company(String name){
this.name = name;
}
//添加公司(可能是子公司或办事处、具体部门)
public abstract void add(Company company);
public abstract void remove(Company company);
//depth表示当前公司或部门所在树状下的深度
public abstract void display(int depeth);
//履行公司或部门职责
public abstract void doDuty();
}
HRDepartment hr部门
/**
/**
* @author duanyimiao
* @create 2018-10-14 9:50 AM
* @description 人力资源部门
**/
public class HRDepartment extends Company {
public HRDepartment(String name) {
super(name);
}
@Override
public void add(Company company) {
}
@Override
public void remove(Company company) {
}
@Override
public void display(int depeth) {
System.out.println(depeth+" "+name);
}
@Override
public void doDuty() {
System.out.println(name+" 员工招聘培训管理");
}
}
FinanceDepartment 财政部门
/**
* @author duanyimiao
* @create 2018-10-14 9:50 AM
* @description 财务部门
**/
public class FinanceDepartment extends Company {
public FinanceDepartment(String name) {
super(name);
}
@Override
public void add(Company company) {
}
@Override
public void remove(Company company) {
}
@Override
public void display(int depeth) {
System.out.println(depeth+" "+name);
}
@Override
public void doDuty() {
System.out.println(name+" 公司财务收支管理");
}
}
ConcreteCompany 具体公司(子公司或办事处)
/**
* @author duanyimiao
* @create 2018-10-14 9:59 AM
* @description 公司或子公司或办事处
**/
public class ConcreteCompany extends Company {
private List<Company> companyList = new ArrayList<>();
public ConcreteCompany(String name) {
super(name);
}
@Override
public void add(Company company) {
companyList.add(company);
}
@Override
public void remove(Company company) {
companyList.remove(company);
}
@Override
public void display(int depeth) {
System.out.println(depeth + " " + name);
for (Company company : companyList) {
company.display(depeth + 1);
}
}
@Override
public void doDuty() {
for (Company company : companyList) {
company.doDuty();
}
}
}
Client 测试类
/**
* @author duanyimiao
* @create 2018-10-14 10:07 AM
* @description
**/
public class Client {
public static void main(String[] args) {
ConcreteCompany root = new ConcreteCompany("北京总部");
root.add(new HRDepartment("北京总部人力资源"));
root.add(new FinanceDepartment("北京总部财务部"));
ConcreteCompany childCompany1 = new ConcreteCompany("华东分公司");
childCompany1.add(new HRDepartment("华东分公司人力资源"));
childCompany1.add(new FinanceDepartment("华东分公司财务部"));
root.add(childCompany1);
ConcreteCompany com1 = new ConcreteCompany("南京办事处");
com1.add(new HRDepartment("南京办事处人力资源"));
com1.add(new FinanceDepartment("南京办事处财务部"));
childCompany1.add(com1);
ConcreteCompany com2 = new ConcreteCompany("杭州办事处");
com2.add(new HRDepartment("杭州办事处人力资源"));
com2.add(new FinanceDepartment("杭州办事处财务部"));
childCompany1.add(com2);
//移除树的分支
//childCompany1.remove(com1);
root.display(1);
root.doDuty();
}
}
输出结果 1 前面数字代表树的层数 相同表示在同一级
1 北京总部
2 北京总部人力资源
2 北京总部财务部
2 华东分公司
3 华东分公司人力资源
3 华东分公司财务部
3 南京办事处
4 南京办事处人力资源
4 南京办事处财务部
3 杭州办事处
4 杭州办事处人力资源
4 杭州办事处财务部
北京总部人力资源 员工招聘培训管理
北京总部财务部 公司财务收支管理
华东分公司人力资源 员工招聘培训管理
华东分公司财务部 公司财务收支管理
南京办事处人力资源 员工招聘培训管理
南京办事处财务部 公司财务收支管理
杭州办事处人力资源 员工招聘培训管理
杭州办事处财务部 公司财务收支管理