开闭原则

开闭原则(Open-Closed PrinCiple,OCP)是指一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。例如:版本更新,尽可能不修改源代码,但是可以增加新功能。
实现开闭原则的思想就是面向抽象编程,我们以超市售卖体系为例:
首先创建一个商品接口GoodsService:

package com.framework.openClosed;

public interface GoodsService {
    Integer getId();
    String getName();
    Double getPrice();//实际项目中金额定义成double小心被挑战
}

超市里比如水果有西瓜、香蕉、梨子等,我们先来创建一个西瓜的类Watermelon

package com.framework.openClosed;

public class Watermelon implements GoodsService {
    private Integer id;
    private String name;
    private Double price;

    public Watermelon(Integer id, String name, Double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    @Override
    public Integer getId() {
        return this.id;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public Double getPrice() {
        return this.price;
    }
}

现在假设我们要给西瓜做活动,价格优惠促销。如果修改Watermelon类中的getPrice方法,则存在一定的风险,可能影响其它地方的调用结果。我们如何在不修改原有代码的基础上,实现这个价格优惠功能呢?现在我们写一个处理优惠逻辑的类WatermelonDisCount:

package com.framework.openClosed;

public class WatermelonDiscount extends Watermelon {

    public WatermelonDiscount(Integer id, String name, Double price) {
        super(id, name, price);
    }

    public Double getOriginPrice() {
        return super.getPrice();
    }

    @Override
    public Double getPrice() {
        //比如打8折
        return super.getPrice() * 0.8;
    }
}

简单的类结构图如下:
微信截图_20200821181755.png