组合模式:主要处理树形结构以处理“整体-部分之间”的层次关系。做到对单个对象和组合对象的处理方式一样。
下面以管理者和普通员工来说明组合模式的应用
(1)创建基本员工类
package com.demo.dp.composite;
public abstract class BaseEmployee {
protected String empName;
protected String empId;
protected int empSalary;
protected String empPosition;
public BaseEmployee(String empName, String empId, int empSalary,
String empPosition) {
this.empName = empName;
this.empId = empId;
this.empSalary = empSalary;
this.empPosition = empPosition;
}
// 添加员工
public abstract void add(BaseEmployee emp);
// 删除员工信息
public abstract void remove(BaseEmployee emp);
// 打印员工信息
public abstract void printEmployeeInfo();
// 打印自身信息
public void printBaseInfo() {
System.out.println("姓名:" + empName + " |员工号:" + empId + " |工资:"
+ empSalary + " |职位:" + empPosition);
System.out.println();
}
public void printSpaceChar(int count){
for(int i=0;i<count;i++){
System.out.print(" ");
}
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public String getEmpId() {
return empId;
}
public void setEmpId(String empId) {
this.empId = empId;
}
public int getEmpSalary() {
return empSalary;
}
public void setEmpSalary(int empSalary) {
this.empSalary = empSalary;
}
public String getEmpPosition() {
return empPosition;
}
public void setEmpPosition(String empPosition) {
this.empPosition = empPosition;
}
}
(2)创建管理者
package com.demo.dp.composite.sub;
import java.util.ArrayList;
import com.demo.dp.composite.BaseEmployee;
public class Manager extends BaseEmployee {
private ArrayList<BaseEmployee> empList = new ArrayList<BaseEmployee>();
public Manager(String empName, String empId, int empSalary,
String empPosition) {
super(empName, empId, empSalary, empPosition);
}
@Override
public void add(BaseEmployee emp) {
empList.add(emp);
}
@Override
public void printEmployeeInfo() {
for(BaseEmployee emp:empList){
if(emp instanceof Manager){
printSpaceChar(emp.getEmpId().length()*6) ;
emp.printBaseInfo() ;
emp.printEmployeeInfo() ;
}else if(emp instanceof CommonEmployee){
printSpaceChar(emp.getEmpId().length()*8) ;
emp.printBaseInfo() ;
}
}
}
@Override
public void remove(BaseEmployee emp) {
if (empList.contains(emp)) {
boolean flag = empList.remove(emp);
System.out.println("remove employee result:" + flag);
}else{
System.out.println("您的手底下没有这个员工,请核对信息重新操作,谢谢。");
}
}
}
(3)创建普通员工
package com.demo.dp.composite.sub;
import com.demo.dp.composite.BaseEmployee;
public class CommonEmployee extends BaseEmployee{
public CommonEmployee(String empName, String empId, int empSalary,
String empPosition) {
super(empName, empId, empSalary, empPosition);
}
@Override
public void add(BaseEmployee emp) {
}
@Override
public void printEmployeeInfo() {
}
@Override
public void remove(BaseEmployee emp) {
}
}
(4)创建测试类
package com.demo.dp.composite;
import com.demo.dp.composite.sub.CommonEmployee;
import com.demo.dp.composite.sub.Manager;
public class Client {
public static void main(String[] args) {
BaseEmployee boss = new Manager("大老板", "1", 10000, "CEO") ;
BaseEmployee finacial = new Manager("张总", "11", 8000, "财务部经理") ;
BaseEmployee humanRecource = new Manager("王总", "12", 8000, "人事部经理") ;
BaseEmployee technical = new Manager("陈总", "13", 8000, "技术部经理") ;
BaseEmployee market = new Manager("吴总", "14", 8000, "市场部经理") ;
BaseEmployee technicalOne = new Manager("主管1", "131", 5000, "技术主管") ;
BaseEmployee technicalTwo = new Manager("主管2", "132", 5000, "技术主管") ;
BaseEmployee devOne = new CommonEmployee("张三", "1311", 4500, "软件工程师") ;
BaseEmployee devTwo = new CommonEmployee("李四", "1312", 4500, "软件工程师") ;
BaseEmployee devThree = new CommonEmployee("王五", "1313", 4500, "软件工程师") ;
boss.add(finacial) ;
boss.add(humanRecource) ;
boss.add(technical) ;
boss.add(market) ;
technical.add(technicalOne) ;
technical.add(technicalTwo) ;
technicalOne.add(devOne) ;
technicalOne.add(devTwo) ;
technicalOne.add(devThree) ;
boss.printBaseInfo() ;
boss.printEmployeeInfo() ;
}
}
输出结果:
姓名:大老板 |员工号:1 |工资:10000 |职位:CEO
姓名:张总 |员工号:11 |工资:8000 |职位:财务部经理
姓名:王总 |员工号:12 |工资:8000 |职位:人事部经理
姓名:陈总 |员工号:13 |工资:8000 |职位:技术部经理
姓名:主管1 |员工号:131 |工资:5000 |职位:技术主管
姓名:张三 |员工号:1311 |工资:4500 |职位:软件工程师
姓名:李四 |员工号:1312 |工资:4500 |职位:软件工程师
姓名:王五 |员工号:1313 |工资:4500 |职位:软件工程师
姓名:主管2 |员工号:132 |工资:5000 |职位:技术主管
姓名:吴总 |员工号:14 |工资:8000 |职位:市场部经理