1.需求分析:
修改不同种类雇员的信息,首先提取抽象:
修改雇员的基本信息
- 修改雇员的薪水结算支付
修改雇员信息前都要首先获取到雇员信息
2. 建立抽象基类:
/**
* template method
* @author
*
*/
public abstract class ChangeEmployeeTransaction {
//执行修改
public boolean executeChange(EmployeeBase emp){
EmployeeBase employee = this.getEmployee(emp);
if(employee==null) return false;
if(changeEmployeeBase(employee)&&changeEmpPaymentMethod(employee)){
return true;
}
return false;
}
//获取雇员信息
public abstract EmployeeBase getEmployee(EmployeeBase employee);
//修改雇员基本信息
public abstract boolean changeEmployeeBase(EmployeeBase employee);
//修改雇员薪水结算支付
public abstract boolean changeEmpPaymentMethod(EmployeeBase employee);
}
3.实现钟点工的修改
/**
* 修改钟点工的信息
* @author
*
*/
public class ChangeHourlyEmpTransaction extends ChangeEmployeeTransaction{
@Override
public EmployeeBase getEmployee(EmployeeBase employee) {
//根据empID获取employee
return getHourlyEmployee((HourlyEmployee) employee);
}
private HourlyEmployee getHourlyEmployee(HourlyEmployee employee){
HourlyEmployee hourlyEmployee = new HourlyEmployee();
hourlyEmployee.setEmpAddress("PD CIA");
hourlyEmployee.setEmpName("BUSH");
return hourlyEmployee;
}
@Override
public boolean changeEmployeeBase(EmployeeBase employee) {
//更改地址姓名
return false;
}
@Override
public boolean changeEmpPaymentMethod(EmployeeBase employee) {
//更改雇员薪水支付方式支付时间
return false;
}
}
4.实现销售人员信息的修改
/**
* 更改销售人员的信息
* ps:需要修改销售人员的奖金计算方式
* @author
*
*/
public class ChangeCommisedEmpTransaction extends ChangeEmployeeTransaction{
@Override
public EmployeeBase getEmployee(EmployeeBase employee) {
CommissionedEmployee e = getCommissionedEmployee((CommissionedEmployee) employee);
return e;
}
private CommissionedEmployee getCommissionedEmployee(CommissionedEmployee employee){
CommissionedEmployee employee2 = new CommissionedEmployee();
employee2.setMonthlSalary((float)3000);
return employee2;
}
@Override
public boolean changeEmployeeBase(EmployeeBase employee) {
return false;
}
@Override
public boolean changeEmpPaymentMethod(EmployeeBase employee) {
return false;
}
5.实现完全按月领薪水的雇员的信息修改
/**
* 更改销售人员的信息
* ps:需要修改销售人员的奖金计算方式
* @author
*
*/
public class ChangeCommisedEmpTransaction extends ChangeEmployeeTransaction{
@Override
public EmployeeBase getEmployee(EmployeeBase employee) {
CommissionedEmployee e = getCommissionedEmployee((CommissionedEmployee) employee);
return e;
}
private CommissionedEmployee getCommissionedEmployee(CommissionedEmployee employee){
CommissionedEmployee employee2 = new CommissionedEmployee();
employee2.setMonthlSalary((float)3000);
return employee2;
}
@Override
public boolean changeEmployeeBase(EmployeeBase employee) {
return false;
}
@Override
public boolean changeEmpPaymentMethod(EmployeeBase employee) {
return false;
}
}
6.测试用例
public class TestChangeHourlyEmpTransaction extends TestCase{
public void testExecute() throws Exception{
ChangeEmployeeTransaction hourlyEmpTransaction = new ChangeHourlyEmpTransaction();
assertEquals(false, hourlyEmpTransaction.executeChange(new HourlyEmployee()));
ChangeEmployeeTransaction commisTransaction = new ChangeCommisedEmpTransaction();
assertEquals(false, commisTransaction.executeChange(new CommissionedEmployee()));
ChangeEmployeeTransaction salaryTransaction = new ChangeSalaryEmpTransaction();
assertEquals(false, salaryTransaction.executeChange(new SalaryEmployee()));
}
}
7.总结
本次的实现主要是为了学习模板方法模式,代码不做过多的实现。通过学习分析,初步理解了模板方法模式的用处和OCP原则以及测试用例的使用。在进行具体的业务编码之前先建立测试程序会尽早的发现问题,极大提高编程效率。