您的位置:首页 > 编程语言 > Java开发

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

2014-10-27 00:00 537 查看
摘要: 雇员工资的计算与支付

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

提取抽象

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

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

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.总结

工资的结算与发放核心部分就是要找出公共部分,提取抽象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 敏捷开发 OCP