Java設計模式(5)-- 七大原則之【開放封閉原則】

5)開放封閉原則(Open-Closed Principle)

定義: “software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification “(代碼應該支持在相同業務類型上的拓展,並且不會因爲依賴業務的修改而修改。)

比如一種在批准醫療保險索賠之前,要先對其進行驗證的保險系統。一個HealthInsuranceSurveyor類負責驗證索賠和ClaimApprovalManager類,負責批准索賠。

HealthInsuranceSurveyor

public class HealthInsuranceSurveyor{
    public boolean isValidClaim(){
        System.out.println("HealthInsuranceSurveyor: Validating health insurance claim...");
        /*Logic to validate health insurance claims*/
        return true;
    }
}

ClaimApprovalManager

public class ClaimApprovalManager {
    public void processHealthClaim (HealthInsuranceSurveyor surveyor)
    {
        if(surveyor.isValidClaim()){
            System.out.println("ClaimApprovalManager: Valid claim. Currently processing claim for approval....");
        }
    }
}

 這樣的設計看起來不會有什麼問題,但這時業務增加對車輛保險的索賠。於是需要增加一個類VehicleInsuranceSurveyor,並且索賠類的代碼要更改爲

public class ClaimApprovalManager {
    public void processHealthClaim (HealthInsuranceSurveyor surveyor)
    {
        if(surveyor.isValidClaim()){
            System.out.println("ClaimApprovalManager: Valid claim. Currently processing claim for approval....");
        }
    }
    public void processVehicleClaim (VehicleInsuranceSurveyor surveyor)
    {
        if(surveyor.isValidClaim()){
            System.out.println("ClaimApprovalManager: Valid claim. Currently processing claim for approval....");
        }
    }
}

在上面的例子中,ClaimApprovalManager通過新增一個方法processVehicleClaim (),來適應新的業務要求。這就違反了開放封閉原則,因爲我們需要修改該類以支持類似業務的新功能。

考慮一下以下的設計思想

1、保持ClaimApprovalManager類的開放,來支持更多類型的保險索賠

2、每當添加新的索賠類型時,ClaimApprovalManager類不會修改到自身的代碼(也就是代碼關閉)

爲此,我們可以這樣設計

保險調查員判斷是否可以索賠,InsuranceSurveyor.java

public abstract class InsuranceSurveyor {
    public abstract boolean isValidClaim();
}

健康保險調查員繼承InsuranceSurveyor,並重寫isValidClaim方法,HealthInsuranceSurveyor.java

public class HealthInsuranceSurveyor extends InsuranceSurveyor{
@Override
    public boolean isValidClaim(){
        System.out.println("HealthInsuranceSurveyor: Validating health insurance claim...");
        /*Logic to validate health insurance claims*/
        return true;
    }
}

 運輸保險員也類似

public class VehicleInsuranceSurveyor extends InsuranceSurveyor{
@Override
    public boolean isValidClaim(){
       System.out.println("VehicleInsuranceSurveyor: Validating vehicle insurance claim...");
        /*Logic to validate vehicle insurance claims*/
        return true;
    }
}

 索賠Manager

public class ClaimApprovalManager {
    public void processClaim(InsuranceSurveyor surveyor){
        if(surveyor.isValidClaim()){
            System.out.println("ClaimApprovalManager: Valid claim. Currently processing claim for approval....");
        }
    }
}

 這樣,我們就能做到ClaimApprovalManager遵守了開放封閉原則,我們的保險制度是現在開放,支持更多類型的保險索賠和每當添加新的保險類型時,ClaimApprovalManager不需要任何的修改

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章