版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/laojiaqi/article/details/47757993
在写代码的时候,经常会遇到switch语句,根据状态码进行不同的操作,该方法简单,快捷,但维护起来较麻烦,也不易扩展。 例如,如下代码
public class Employee {
private int mType;
static final int salary=500;
static final int commission=500;
static final int bonus=1000;
static final int ENGINEER=0;
static final int SALESMAN=1;
static final int MANAGER=2;
public Employee(int type) {
this.mType=type;
}
int payAmout(){
switch (mType) {
case ENGINEER:
return salary;
case SALESMAN:
return salary+commission;
case MANAGER:
return salary+bonus;
default:
throw new RuntimeException();
}
}
}
该类有Employee类,并且区分了三种状态:ENGINEER、SALESMAN、MANAGER。运行代码如下所示
public class Main {
public static void main(String[] args) {
Employee enginer=new Employee(Employee.ENGINEER);
System.out.println("enginer工资为:"+enginer.payAmout());
Employee manager=new Employee(Employee.MANAGER);
System.out.println("manager工资为:"+manager.payAmout());
Employee salesman=new Employee(Employee.SALESMAN);
System.out.println("salesman工资为:"+salesman.payAmout());
}
}
运行结果为:
此时,如果要新加一个职位,那么就必须增加一个状态码,然后在switch语句中,加入该状态码的行为,接着,建立对象的时候,也要使用该状态码。(万恶的状态码,万一搞错了怎么办),运用多态可以很好的解决这个问题。首先给上类图
(改图EmployeeType下的箭头应该为空心,表示继承)
public class Employee {
static final int salary=500;
static final int commission=500;
static final int bonus=1000;
EmployeeType mEmployeeType;
public void setType(EmployeeType employeeType){
this.mEmployeeType=employeeType;
}
int payAmout(){
return mEmployeeType.payAmout();
}
}
注意这个类的 mEmployeeType变量,该变量保存的是当前状态(也就是代表哪个职位)
EmployeeType是一个抽象类,如下
public abstract class EmployeeType {
abstract int payAmout();
}
下面是三个子类的实现方式
public class Engineer extends EmployeeType{
int payAmout() {
return Employee.salary;
}
}
public class Manager extends EmployeeType{
int payAmout() {
return Employee.salary+Employee.bonus;
}
}
public class Salesman extends EmployeeType{
int payAmout() {
return Employee.salary+Employee.commission;
}
}
最后就是运行代码了,
public class Main {
public static void main(String[] args) {
Manager manager=new Manager();
Salesman salesman=new Salesman();
Engineer engineer=new Engineer();
Employee employee=new Employee();
employee.setType(manager);
System.out.println("manager工资为:"+employee.payAmout());
employee.setType(salesman);
System.out.println("salesman工资为:"+employee.payAmout());
employee.setType(engineer);
System.out.println("engineer工资为:"+employee.payAmout());
}
}