关于Java抽象类与抽象方法的使用(2)

在完成了以上需求后,此时又提出新需求,按照以下格式打印每个月的工资条,并且打印的顺序必须按以下格式打印出来:
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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ae8383c7a8c79bbaf2aa04fdff8c1fa6.html