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