六大设计原则之开闭原则03

目录

1.概述

2.业务场景

3.运用设计原则前代码实现

3.1.代码实现

3.2.总结

4.运用设计原则后代码实现

4.1.代码实现

4.2.总结


1.概述

开闭原则(Open-Close Principle,OCP), 一般认为最早提出开闭原则的是波兰特.迈耶。他在1988年发表的《面向对象软件构造》中给出的。在面向对象编程领域中,开闭原则规定软件中的对象,类,模块和函数对扩展应该是开放的,但对于修改是封闭。这意味着应该用抽象定义结构,用具体实现扩展细节,以此确保软件系统开放和维护过程的可靠性。开闭原则的核心思想也可以理解为面向抽象编程。

2.业务场景

对于外部的调用方来说,只要能体现出面向抽象编程,定义出接口并实现器方法,即不修改原有方法体,只通过继承方式进行扩展,都可以体现出开闭原则。

这里计算三种形状的面积,如长方形,三角形,圆形,他们在类中已经按照固定的公式实现,其中圆形面积公式中π=3.14,但后续由于π取值的精度对于某些场景是不足的,需要扩展,接下来就通过模拟这个场景体现开闭原则。

3.运用设计原则前代码实现

3.1.代码实现

ICalculationArea.java

package chapter02.ocp;
public interface ICalculationArea {
    /**
     * 计算面积,长方形
     *
     * @param x 长
     * @param y 宽
     * @return 面积
     */
    double rectangle(double x, double y);
​
    /**
     * 计算面积,三角形
     *
     * @param x 边长x
     * @param y 边长y
     * @param z 边长z
     * @return 面积
     */
    double triangle(double x, double y, double z);
​
    /**
     * 计算面积,圆形
     *
     * @param r 半径
     * @return 面积
     */
    double circular(double r);
}

CalculationArea.java

package chapter02.ocp;
public class CalculationArea implements ICalculationArea {
    private final static double n = 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 n * r * r;
    }
}

3.2.总结

1.如果不考虑开闭原则,也不思考这种方法在整个工程服务中的使用情况,那么直接修改π值就可以了,但这样做就会破坏整个工程服务的稳定性,也会造成一些风险。

CalculationArea.java

package chapter02.ocp;
public class CalculationArea implements ICalculationArea {
    private final static double n = 3.1415926D;
    @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 n * r * r;
    }
}

4.运用设计原则后代码实现

4.1.代码实现

CalculationAreaExt.java

package chapter02.ocp;
public class CalculationAreaExt extends CalculationArea {
    private final static double n = 3.1415926D;
    public double circular(double r) {
        return n * r * r;
    }
}

4.2.总结

1.扩展后的方法已经把求圆形面积的精度增长,需要使用此方法的用户可以直接调用。而其他的方法,如长方形面积,三角形面积,则可以继续使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值