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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值