目录
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.扩展后的方法已经把求圆形面积的精度增长,需要使用此方法的用户可以直接调用。而其他的方法,如长方形面积,三角形面积,则可以继续使用。