开闭原则要求对象、类、模块、函数对扩展开发,对修改封闭。所以要用抽象来定义结构,用实现扩展细节,可以理解为面向抽象编程,定义接口并实现方法,在扩展时通过继承的方式扩展。
案例
public interface ICalculationArea {
//计算长方形面积
double rectangle (double x, double y);
//计算三角形面积
double triangle(double x, double y, double z);
//计算圆形面积
double circular(double r);
}
public class CalculationArea implements ICalculationArea{
private final static double π = 3.14D;
@Override
public double rectangle(double x, double y) {
return x * y;
}
@Override
public double triangle(double x, double y, double z) {
double p = (x + y + z) / 2;
return Math.sqrt(p * (p - x) * (p - y) * (p - z));
}
@Override
public double circular(double r) {
return π * r * r;
}
}
这里的π已经定义好了,如果不左考虑简单地进行修改就是直接在代码中修改π的值,如果按照开闭原则的话,应该新建一个CalculationArea的子类在子类中定义π,然后重写计算圆形面积的方法。
public class CalculationAreaExt extends CalculationArea{
private final static double π = 3.1415926D;
@Override
public double circular(double r) {
return π * r *r;
}
}
对于子类,三角形和长方形的面积计算逻辑还是原来的,圆形的面积计算π的精度更高了。
那么开闭原则解决了什么样的问题呢?比如有这样的情况,不同的接口都依赖了某个接口,也就是一个公共接口,当某个接口需要该接口的某个方法进行调整,但是其他的接口又需要使用原本的逻辑,那么开闭原则很好地解决了这个问题,通过开闭原则,迭代代码时,只影响到有需要的代码。开闭原则的目的是不因为个例的需求变化而改变预订的实现类。
参考资料:《重学Java设计模式》