扩展开放,修改封闭 开闭原则规定“软件中的对象(类、模块、函数等等)应该对应扩展是开发的,但是对于修改是封闭的”
面经计算案例
public interface ICalculationArea {
/**
* 计算面积,长方形
*
* @param x 长
* @param y 宽
* @return 面积
*/
double rectangle(double x, double y);
/**
* 计算面积,三角形
* @param x 边长x
* @param y 边长y
* @param z 边长z
* @return 面积
*
* 海伦公式:S=√[p(p-a)(p-b)(p-c)] 其中:p=(a+b+c)/2
*/
double triangle(double x, double y, double z);
/**
* 计算面积,圆形
* @param r 半径
* @return 面积
*
* 圆面积公式:S=πr²
*/
double circular(double r);
}
private final static double π = 3.14D;
public double rectangle(double x, double y) {
return x * y;
}
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));
}
public double circular(double r) {
return π * r * r;
}
当业务需要 π需要保留5位小数时,我们不能修改原有定义了的逻辑。
没有在原有的逻辑上去修改, 而是继承原有的接口上重新定义扩展该接口的逻辑。
public class CalculationAreaExt extends CalculationArea {
private final static double π = 3.141592653D;
@Override
public double circular(double r) {
return π * r * r;
}
}
public static void main(String[] args) {
CalculationArea area = new CalculationAreaExt();
double circular = area.circular(4);
System.out.println("circular = " + circular);
}