聊聊软件设计原则(一)开闭原则(OCP)

 开闭原则(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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容