设计模式 - 组合模式

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

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


(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  |职位:市场部经理




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值