在完成了以上需求后,此时又提出新需求,按照以下格式打印每个月的工资条,并且打印的顺序必须按以下格式打印出来:
XXX每个月薪资为:
基本薪资:XXX元
绩效奖金:XXX元
该月总工资为:XXX元
按照第一个例子的实现方式无法满足这个需求,第一个例子的打印顺序是由调用者决定的,无法统一控制。此时就是模板方法设计模式登场的时候了。基于第一个例子,改造一下职员类Employee,增加打印工资条的方法public final void printSalary()如下:
/**
* 定义职工类,每个职工的薪水都由基本薪资跟绩效奖金组成
*/
public abstract class Employee {
/**
* 岗位名称
*/
private String jobName;
/**
* 所有职工的每月基本薪资都一样
* @return
*/
public int getBaseSalary(){
return 10000;
}
/**
* 所有职工都有绩效奖金,但是普通程序员跟技术总监的不一样,
* 所以这里无法给出具体实现,需要在子类中实现
* @return
*/
public abstract int getOtherSalary();
/**
* 获取每个月工资总额
* @return
*/
public int getTotalSalary(){
return this.getBaseSalary() + this.getOtherSalary();
}
/**
* 定义执行顺序模板,模板中有些方法(抽象方法)是要在子类中实现
* 打印工资条,定义为final类,禁止被子类重写
*/
public final void printSalary(){
System.out.println(this.jobName + "每个月薪资为:");
System.out.println("基本薪资:" + this.getBaseSalary() + "元");
System.out.println("绩效奖金:" + this.getOtherSalary() + "元");
System.out.println("该月总工资为:" + getTotalSalary() + "元");
}
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
}
打印每个月工资条:
public class AbstractMain {
public static void main(String[] args){
Coder coder = new Coder();
coder.setJobName("程序员");
coder.printSalary();
Cto cto = new Cto();
cto.setJobName("技术总监");
cto.printSalary();
}
}
以上执行结果为:
程序员每个月薪资为:
基本薪资:10000元
绩效奖金:3000元
该月总工资为:13000元
技术总监每个月薪资为:
基本薪资:10000元
绩效奖金:20000元
该月总工资为:30000元
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx