重构——以多态取代条件表达式(状态模式)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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());
}
}


猜你喜欢

转载自blog.csdn.net/laojiaqi/article/details/47757993