《敏捷软件开发:原则,模式与实践》学习总结《二》

本文详细介绍了三种不同类型的雇员(钟点工、销售人员和月薪制员工)的薪资计算与发放策略,通过建立抽象基类和具体实现类,实现了工资的灵活计算和定时发放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

建立不同雇员对应的类后,下面实现不同雇员的工资结算和发送。

  1. 提取抽象

      抽象一:雇员都要计算工资

      抽象二:雇员都要在一定的时间点发工资

  2.建立抽象基类

/**
 * 抽象:发放薪水,在一定的时间发放
 * @author 
 * @param <T>
 *
 */

public abstract class PaymentMethod {
    
    public abstract boolean execute(EmployeeBase employeeBase);//发放薪水
    
    public abstract boolean isPayDay(Date date);//判断是否是发薪日
    
    
    
}

3.实现钟点工的薪水计算与发放

public class HourlyPaymentMethod extends PaymentMethod{


    
    /**
     * 计算小时工的工资
     * @param hourlyEmployee
     * @return
     */
    private float pay(HourlyEmployee hourlyEmployee){
        try {
            float salary = 0;
            List<TimeCard> timeCard = hourlyEmployee.getTimeCard();
            if(SalaryUtils.isEmpty(timeCard)) return 0;
            for(TimeCard tCard:timeCard){
                Float hours = TimeCard.getWorkHourly(tCard.getStartTime(), tCard.getEndTime());
                Float rate = hourlyEmployee.getHourlyRate();
                if(hours<=8){
                    salary += hourlyEmployee.getHourlyRate()*hours;
                }else{
                    salary += (float) ((hours-8)*rate*1.5+rate*8);
                }
            }
            
            return salary;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }
    //按照工作小时计算,如果当日工作超过八小时则超过部分按照时薪的1.5倍支付,每周五发放
    @Override
    public boolean isPayDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int weekDay = calendar.get(Calendar.DAY_OF_WEEK);
        if(weekDay-1==5) return true;
        return false;
    }

    @Override
    public boolean execute(EmployeeBase employeeBase) {
        try {
            Date date = new Date();
            if(isPayDay(date)){
                pay((HourlyEmployee) employeeBase);
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    
}

4.实现销售人员的薪水发放

public class CommissionedPaymentMethod extends PaymentMethod{

    @Override
    public boolean execute(EmployeeBase employeeBase) {
        CommissionedEmployee e = (CommissionedEmployee) employeeBase;
        if(isPayDay(e.getLastPayday())){
            pay(e);
        }
        return false;
    }

    /**
     * param:date 上一次发薪时间
     * 是否是发薪日
     */
    @Override
    public boolean isPayDay(Date date){
        //当前日期
        Date currentDate = new Date();
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(currentDate);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(date);
        long mils = calendar1.getTimeInMillis()-calendar2.getTimeInMillis();
        int days = (int) (mils/(1000*60*60*24));
        if(days==14) return true;
        return false;
    }
  //计算销售人员的工资
    private float pay(CommissionedEmployee commissionedEmployee){
        //根据销售单据计算奖金
        SaleReceipt saleReceipt = commissionedEmployee.getSaleReceipt();
        float reward = getSaleReward(saleReceipt);
        float salary = 0;
        salary = commissionedEmployee.getMonthlSalary()+reward;
        return salary;
    }
    //计算奖金
    private float getSaleReward(SaleReceipt saleReceipt){
        return 0;
    }
    
}

5.实现完全领月薪的雇员工资结算

public class SalaryEmPaymentMethod extends PaymentMethod{

    @Override
    public boolean execute(EmployeeBase employeeBase) {
        Date date = new Date();
        if(isPayDay(date)){
            pay((SalaryEmployee) employeeBase);
            return true;
        }
        return false;
    }
    //发薪日
    @Override
    public boolean isPayDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        int today = calendar.get(Calendar.DAY_OF_MONTH);
        if(lastDay==today)
            return true;
        return false;
    }
    //计算工资
    private float pay(SalaryEmployee salaryEmployee){
        float salary = 0;
        salary = salaryEmployee.getSalary();
        return salary;
    }
    
}

至此,三种雇员的工资计算方法实现完毕

6.总结

工资的结算与发放核心部分就是要找出公共部分,提取抽象。

转载于:https://my.oschina.net/fangfeiAI/blog/337684

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值