架构师的成长之路 —— 七大软件设计原则(一) 开闭原则

当我们对一段代码进行扩展的时候我们需要遵守开闭原则,即对扩展开放,对修改关闭

举例一:

我们现在有一个商品信息接口里面有3个方法分别是获取id,获取商品名称,获取商品价格:

public interface Commodity {
    Integer getId();
    String getName();
    Double getPrice();
}

现在我们有一个手机类去实现这个接口,我们在这个实现类中提供一个电话商品的三个字段,和一个全参的构造方法,代码如下:

public class PhoneCommodity implements Commodity{
    private Integer id;
    private String name;
    private Double price;

    public PhoneCommodity(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;
    }
}

好了那么我们来一个简单的测试:

public class PhoneTest {
    public static void main(String[] args) {
        Commodity commodity = new PhoneCommodity(1,"锤子",6666d);
        System.out.println("商品id: " + commodity.getId() +
                            "\n商品名称: " + commodity.getName() +
                            "\n商品价格: " + commodity.getPrice());
    }
}

测试结果为:
在这里插入图片描述那么如果现在需求改了,我们这个商品现在有折扣了,那么我们该怎么办,最简单的办法就是去我们的实现类中去修改代码,那么我们的需求不可能是每一天都打折,如果恢复原价或者涨价怎么办,我们不可能每一次都修改源代码吧,这样会造成我们后台系统的不稳定性,如果是一个比较大的项目,我们不知道有谁什么时候用过这个方法,那么这个时候我们就修改源码会造成影响,所以我们采取另一种方式。我们再写一个类,这个类来继承我们之前的手机实现类通过重写价格代码来进行实现,代码如下:

public class PhoneDiscount extends PhoneCommodity{
    public PhoneDiscount(Integer id, String name, Double price) {
        super(id, name, price);
    }

    @Override
    public Double getPrice() {
        return super.getPrice() * 0.5;
    }
}

我们来看一下结果:
在这里插入图片描述我们这回不用去修改源码了,也可以进行代码的扩展,但是这回又有了一个新的问题,我们想要查询这个商品的原价的时候,发现这个数据已经丢失了。那么我们这个时候应该如何进行解决呢?我们可以在我们扩展的类中提供一个方法来进行价格的控制,代码如下:

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

//    @Override
//    public Double getPrice() {
//        return super.getPrice() * 0.5;
//    }

    public Double phoneDiscount(){
        return super.getPrice() * 0.5;
    }

那么我们再测试类中就需要稍微修改一下将我们之前的那个实例进行一个强转,如果不进行强转那么你想去获取折扣之后的价格是找不到方法的:

public class PhoneTest {
    public static void main(String[] args) {
        Commodity commodity = new PhoneDiscount(1,"锤子",6666d);
        PhoneDiscount phoneDiscount = (PhoneDiscount)commodity;
        System.out.println("商品id: " + phoneDiscount.getId() +
                            "\n商品名称: " + phoneDiscount.getName() +
                            "\n商品原价: " + phoneDiscount.getPrice() +
                            "\n商品现价: " + phoneDiscount.phoneDiscount());
    }
}

我们来看一下输出结果:
在这里插入图片描述
现在这个结果就很满足我们的需求,而且重点是我们不需要在源码上进行修改来进行扩展这个就是所谓开闭原则,对扩展开放,对修改关闭。

猜你喜欢

转载自blog.csdn.net/weixin_45550128/article/details/107541673