扩展开放,修改封闭 开闭原则规定“软件中的对象(类、模块、函数等等)应该对应扩展是开发的,但是对于修改是封闭的”

面经计算案例

  1. public interface ICalculationArea {
  2. /**
  3. * 计算面积,长方形
  4. *
  5. * @param x 长
  6. * @param y 宽
  7. * @return 面积
  8. */
  9. double rectangle(double x, double y);
  10. /**
  11. * 计算面积,三角形
  12. * @param x 边长x
  13. * @param y 边长y
  14. * @param z 边长z
  15. * @return 面积
  16. *
  17. * 海伦公式:S=√[p(p-a)(p-b)(p-c)] 其中:p=(a+b+c)/2
  18. */
  19. double triangle(double x, double y, double z);
  20. /**
  21. * 计算面积,圆形
  22. * @param r 半径
  23. * @return 面积
  24. *
  25. * 圆面积公式:S=πr²
  26. */
  27. double circular(double r);
  28. }
  1. private final static double π = 3.14D;
  2. public double rectangle(double x, double y) {
  3. return x * y;
  4. }
  5. public double triangle(double x, double y, double z) {
  6. double p = (x + y + z) / 2;
  7. return Math.sqrt(p * (p - x) * (p - y) * (p - z));
  8. }
  9. public double circular(double r) {
  10. return π * r * r;
  11. }

当业务需要 π需要保留5位小数时,我们不能修改原有定义了的逻辑。

没有在原有的逻辑上去修改, 而是继承原有的接口上重新定义扩展该接口的逻辑。

  1. public class CalculationAreaExt extends CalculationArea {
  2. private final static double π = 3.141592653D;
  3. @Override
  4. public double circular(double r) {
  5. return π * r * r;
  6. }
  7. }
  1. public static void main(String[] args) {
  2. CalculationArea area = new CalculationAreaExt();
  3. double circular = area.circular(4);
  4. System.out.println("circular = " + circular);
  5. }