9.6 replace conditional with polymorphism (以多态取代條件表達式)

2016-08-13

條件表達式,根據對象類型的不同而選擇不同的行為。

将這個條件表達式的每一個分支放進一個子類内的覆寫函數中,然後将原始函數聲明為抽象函數。

動機:

多态使你不必編寫明顯的條件表達式。

如果同一組條件表達式在程序許多地方出現,那麼使用多态的收益是最大的。

做法:

使用replace conditional with polymorphism之前,首先必須有一個繼承結構。

如果要處理的條件表達式是一個更大函數中的一部分,首先對條件表達式進行分析,然後使用extract method。

如果有必要,使用move method将條件表達式放置到繼承結構的頂端。

任選一個子類,在其中建立一個函數,使之覆寫超類中容納條件表達式的那個函數。将與該子類相關的條件表達式分支複制到新建函數中,并調整。

舊代碼

class Engineer extends EmployeeType{     int getTypeCode(){         return Employee.ENGINEER;     } } class Manager extends EmployeeType{     int getTypeCode(){         return Employee.MANAGER;     } } class Salesman extends EmployeeType{     int getTypeCode(){         return Employee.SALEMAN;     } } class Employee... private employeeType _type; int payAmount(){     switch(getType()){     case EmployeeType.ENGINEER:         return _monthlySalary;     case EmployeeType.SALESMAN:         return _monthlySalary + _commission;     case EmployeeType.MANAGER:         return _monthlySalary + bonus;     default;         throw new RuntimeException();     } } int getType(){     return _type.getTypeCode(); } void setType(int arg){     _type = EmployeeType.newType(arg); } class employeeType... static EmployeeType newType(int code){     switch(code){         case ENGINEER:             return new Engineer();         case SALESMAN:             return new Salesman();         case MANAGER:             return new Manager();         default:             throw new IllegalArgumentException();     } } static final int ENGINEER = 0; static final int SALESMAN = 1; static final int MANAGER = 2;


新代碼

class Employee... private Engineer _type; int payAmount(){     return _type.payAmount(this); }   class Engineer... int payAmount(Employee emp){     return emp.getMonthlySalary(); } class Salesman... int payAmount(Employee emp){     return emp.getMonthlySalary() + emp.getCommission(); } class Manager... int payAmount(Employee emp){     return emp.getMonthlySalary() + emp.getBonus(); }  class EmployeeType... abstract int payAmount(Employee emp);






http://m.juhua625748.cn|http://wap.juhua625748.cn|http://www.juhua625748.cn||http://juhua625748.cn