概念
开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。
软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。
对于开放,我们是指在对外扩展,新需求,新功能需要加入,我们的软件本身是易于扩展的,所以“适应时代的发展需要”;
对于封闭,我们是指软件本身的功能是不允许修改的,要保持独立性和稳定性,避免再次发生改动。
问题由来
比如我们有个实现各种计算的功能,加减乘除,现在需要再加上 取余运算;
此时 需要在原有的实现类中 添加相应的功能,
一方面需要修改现有类,需要了解原有逻辑;
另一方面,扩展之后难免引入其他问题,甚至造成其他功能不稳定,不利于维护;
shut up and show my code:(别BB,上代码)
package demo;
/**
* @author WeiSong <br>
* @since 0.0.1
* 2020/11/2 15:13
*/
public class Calculate {
public int add(int a, int b) {
return a + b;
}
public int sub(int a, int b) {
return a - b;
}
public int muti(int a, int b) {
return a * b;
}
public int div(int a, int b) {
return a / b;
}
public static void main(String[] args) {
Calculate calculate = new Calculate();
int a = 10, b = 5;
int result = calculate.add(a, b);
System.out.println(result);
result = calculate.sub(a, b);
System.out.println(result);
result = calculate.muti(a, b);
System.out.println(result);
result = calculate.div(a, b);
System.out.println(result);
}
}
产生原因
耦合度太高,抽象层面不够,扩展起来比较困难。
解决方案
可以抽象出一个计算接口,具体的功能在实现类中完成。
接口:
package demo;
/**
* @author WeiSong <br>
* @since 0.0.1
* 2020/11/2 15:25
*/
public interface Calculate {
int calculate(int a, int b);
}
具体实现:
package demo;
/**
* @author WeiSong <br>
* @since 0.0.1
* 2020/11/2 15:26
*/
public class AddCalculate implements Calculate {
@Override
public int calculate(int a, int b) {
return a + b;
}
}
package demo;
/**
* @author WeiSong <br>
* @since 0.0.1
* 2020/11/2 15:28
*/
public class SubCalculate implements Calculate {
@Override
public int calculate(int a, int b) {
return a - b;
}
}
新增一个功能:直接基于接口去实现,原有的都不用动。
package demo;
/**
* @author WeiSong <br>
* @since 0.0.1
* 2020/11/2 15:29
*/
public class RemainCalculate implements Calculate {
@Override
public int calculate(int a, int b) {
return a % b;
}
}
编者按:
上面的小栗子解释了这个原则的一种情况,实际的系统中业务功能会很多,耦合度也会很高,所以开放封闭原则其实也是我们需要遵循的一个基本原则。思想理念就是 尽量抽象和解耦,易于扩展。