开闭原则(Open-Closed principle,OCP)是指一个软件实体(如类,模块,函数等)应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。它强调的是用抽象搭建框架,用实现扩展细节,可以提高软件系统的可复用性和可维护性。
开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定、灵活的系统,在尽量不修改源代码的情况下,扩展新功能。
开闭原则的核心思想是面向抽象编程。为方便理解,来看一段代码:
以书籍销售为例,首先创建一个书籍接口IBook:
/**
* @Author: zhouzhen
* @email: zhouzhen0517@foxmail.com
* @Description 书籍接口
* @Date: Create in 9:10 2020/4/9
*/
public interface IBook {
Integer getId();
String getName();
Double getPrice();
}
以IT生态为例,有JAVA,Python,大数据,AI,测试等书籍,我们来创建一个JAVA的书籍类 JavaBook并实现IBook接口:
/**
* @Author: zhouzhen
* @email: zhouzhen0517@foxmail.com
* @Description Java书籍类
* @Date: Create in 9:14 2020/4/9
*/
public class JavaBook implements IBook{
private Integer Id;
private String name;
private Double price;
public JavaBook(Integer id, String name, Double price) {
Id = id;
this.name = name;
this.price = price;
}
public Integer getId() {
return Id;
}
public String getName() {
return name;
}
public Double getPrice() {
return price;
}
}
假设该书同步在狗东和某宝两个平台销售,并同时调用getPrice()方法获取价格。现在接到营销需求,为了提高JavaBook的销量,我们要对狗东上的JavaBook进行打折,但某宝不变。如果直接修改JavaBook的getPrice()方法,就会影响到某宝的调用结果,大概率去财务领三个月工资拎包滚蛋。那该如何在不修改源代码的前提条件下实现这个需求呢?
我们再写一个处理优惠逻辑的类,JavaDiscountBook :
/**
* @Author: zhouzhen
* @email: zhouzhen0517@foxmail.com
* @Description JavaBook折扣类
* @Date: Create in 9:26 2020/4/9
*/
public class JavaDiscountBook extends JavaBook{
public JavaDiscountBook(Integer id, String name, Double price) {
super(id, name, price);
}
public Double getOriginPrice(){
return super.getPrice();
}
public Double getPrice(){
//假设打八折
return super.getPrice() * 0.8;
}
}
狗东只需要与子类的getPrice()方法对接,就能实现打折的功能需求。同时没有对原来的代码进行修改,不会影响到某宝的调用结果,保证了系统的稳定性。
文章参考
《Spring5核心原理》〔中〕谭勇德(Tom)