1. 程式人生 > >不良程式碼展示-父類中可以抽象出子類的行為

不良程式碼展示-父類中可以抽象出子類的行為

把一段程式碼,業務邏輯剝離後,給大家看看。

基類:

package testjava;

/**
 * 書的基類
 */
public class BaseBook {
    private int type = -1;
    
    public BaseBook(int type) {
        this.type = type;
    }
    
    /**
     * 列印頁面
     */
    public void printPage() {
        if (type == 1) {
            System.out.println("Print with the green color.");
        } else if (type == 2) {
            System.out.println("Print with the blue color.");
        } else {
            System.out.println("Print with the white color.");
        }
    }
}

子類1:
package testjava;

/**
 * 綠色的書
 */
public class GreenBook extends BaseBook {
    public GreenBook(int type) {
        super(type);
    }
    
    /**
     * 得到顏色
     * @return 顏色 
     */
    public String getColor() {
        return "Green";
    }
}

子類2:
package testjava;

/**
 * 藍色的書
 */
public class BlueBook extends BaseBook {
    
    public BlueBook(int type) {
        super(type);
    }
    
    /**
     * 得到顏色
     * @return 顏色 
     */
    public String getColor() {
        return "Blue";
    }
}

呼叫的類:
package testjava;

/**
 * 執行類
 */
public class Testjava {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        BlueBook bb = new BlueBook(2);
        bb.printPage();
        
        GreenBook gb = new GreenBook(1);
        gb.printPage();
    }
}

執行結果當然是對的。可是,子類的行為,卻定義在了父類之中了。也就是說,基類的“書”,卻根據每本書的顏色去做行為判斷的。

        if (type == 1) {
            System.out.println("Print with the green color.");
        } else if (type == 2) {
            System.out.println("Print with the blue color.");
        } else {
            System.out.println("Print with the white color.");
        }

這個結構,擴充套件性不好,也不好維護,也不好閱讀。

問當事人,當事人說,我在父類沒法知道是哪個子類啊。但是這個業務是可以抽取的,所以就寫成這個樣子了。

其實,可以這麼寫的。

基類:

package testjava.right;

/**
 * 書的基類
 */
public abstract class BaseBook {
    
    public abstract String getColor();
    
    /**
     * 列印頁面
     */
    public void printPage() {
        System.out.println("Print with the " + getColor() + " color.");
    }
}

子類1:
package testjava.right;

/**
 * 藍色的書
 */
public class BlueBook extends BaseBook {
    
    /**
     * 得到顏色
     * @return 顏色 
     */
    public String getColor() {
        return "Blue";
    }
}

子類2:
package testjava.right;

/**
 * 綠色的書
 */
public class GreenBook extends BaseBook {

    /**
     * 得到顏色
     * @return 顏色 
     */
    public String getColor() {
        return "Green";
    }
}

執行類:
package testjava.right;

/**
 * 執行類
 */
public class Testjava {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        BlueBook bb = new BlueBook();
        bb.printPage();
        
        GreenBook gb = new GreenBook();
        gb.printPage();
    }
}

把屬於子類的行為,定義成抽象函式,由子類去實現。OK