Java设计模式(02) -- 开闭原则

本文深入解析面向对象设计中的六大原则之一——开闭原则,并通过计算不同形状面积的示例,展示了如何遵循开闭原则进行代码设计,以提高软件系统的可靠性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

六大设计原则

单一职责原则定义:约定一个类应该有且仅有一个改变类的原因;

开闭原则定义:在面向对象编程领域中,开闭原则规定软件中的对象、类、模块和函数对扩展应该是开放的,但对于修改是封闭的。这意味着应该用抽象定义结构,用具体实现扩展细节,以此确保软件系统开发和维护过程的可靠性,核心思想也可以理解为面向抽象编程。

示例

计算三种形状的面积,如长方形、三角形、圆形

定义接口

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);

}

实现类:在实现类中,分别实现三种类型的面积计算,长方形(rectangle)、三角形(triangle)、圆形(circular)。其中,圆形面积的 π 值取的是 3.14D,这也是要扩展精度的方法和体现开闭原则的地方

public class CalculationArea implements ICalculationArea {

    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;
    }

}

违背原则方案

如果不考虑开闭原则,也不思考这种方法在整个工程服务中的使用情况,那么直接修改π值就可以了;但这样做就会破坏整个工程服务的稳定性,也会造成一些风险。例如,用原来精度的π值计算出的圆形面积本可以满足需求,但是因为精度加长破坏了原有精度下的稳定性。

 private final static double π = 3.141592653D;

 public double circular(double r) {
        return π * r * r;
}

开闭原则改善代码

开闭原则的主要目的是不能因为个例需求的变化而改变预定的实现类,除非预定的实现类有错误。实现过程是继承父类扩展需要的方法,同时可以保留原有的方法,新增自己需要的方法。

public class CalculationAreaExt extends CalculationArea {

    private final static double π = 3.141592653D;

    @Override
    public double circular(double r) {
        return π * r * r;
    }

}

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

内容来源 ---《重学Java设计模式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值