设计模式 - 组合模式

来源:互联网 发布:手机淘宝首页切图模块 编辑:程序博客网 时间:2024/04/27 18:20

组合模式:主要处理树形结构以处理“整体-部分之间”的层次关系。做到对单个对象和组合对象的处理方式一样。

下面以管理者和普通员工来说明组合模式的应用


(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);}@Overridepublic void add(BaseEmployee emp) {empList.add(emp);}@Overridepublic 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() ;}}}@Overridepublic 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);}@Overridepublic void add(BaseEmployee emp) {}@Overridepublic void printEmployeeInfo() {}@Overridepublic 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  |职位:市场部经理




0 0
原创粉丝点击