设计模式 - 六大设计原则之OCP(开闭原则)

Posted 小小工匠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 - 六大设计原则之OCP(开闭原则)相关的知识,希望对你有一定的参考价值。

文章目录


概述

Open-Close Principle

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

开闭原则的核心思想-----> 面向抽象编程。


Case

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

需求: 计算三种形状的面积,比如长方形、三角形、圆形。 其中π=3.14 。但后续由于π值的精度对某系场景是不足的,需要扩展。

我们先给出既有的代码实现:

接口定义

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




接口实现

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;
    


实现类中,分别对三种类型的面积进行计算, 其中在圆形计算中 π的取值是3.14 , 这也是要扩展精度的方法和体现开闭原则的地方。


Bad Impl

不考虑开闭原则的话,也不考虑这个方法在整个工程中的是使用的情况的话,直接修改 π的取值,这样做的话,无疑会破坏整个工程的稳定性,带来一些风险。

假设我们现在要求齿轮件的啮合程度,也需要使用带π ,修改如下

public class CalculationArea implements ICalculationArea 

    private final static double π = 3.1415926D;

    ......
    ......
    
    public double circular(double r) 
        return π * r * r;
    




Better Impl

按照开闭原则实现的方式并不复杂, 它的主要的目的是不能因为个例需求的变化而改变预定的实现类, 除非预定的实现类有错误。

实现过程是继承父类扩展需要的方法,同时可以保留原有的方法,新增自己需要的方法。

public class CalculationAreaExt extends CalculationArea 

    private final static double π = 3.141592653D;

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


扩展后的方法已经实现了新的功能需求,需要使用此方法可以直接调用。而其他方法,比如长方形的面积、三角形的面积,则可以继续使用。

以上是关于设计模式 - 六大设计原则之OCP(开闭原则)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式——六大原则之开闭原则

六大设计原则(SOLID)

设计模式六大原则

C#软件设计——小话设计模式原则之:开闭原则OCP

「设计模式」六大原则之二:开闭职责小结

「设计模式」六大原则之二:开闭职责小结