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不需要任何的修改。