手记

【九月打卡】第3天+开闭原则

课程名称:Java设计模式精讲 Debug方式+内存分析

课程章节:第3章 软件设计七大原则

主讲老师:Geely

课程内容:

问题1)开闭原则,最基层的原则。

开闭原则**:一个软件实体如类,模块,函数应该对扩展开发,对修改关闭(只扩展不修改)**。对修改行为的约束。

开闭原则的实现方法**:面向抽象编程,面向接口编程,**对业务进行抽象,写的都是抽象方法或者类。(不去修改原有的,不写具体的实现,而是在抽象的基础上进行添加或实现。)

优点:高复用和易维护。

问题2)为什么开闭原则只扩展,不修改呢?

只扩展不修改。(越基层的影响越大,越表层的影响越小)

修改原来接口,就得修改所有继承该接口的类,失去了接口规范的作用,并且非常复杂。

修改原来的类,如果该类非常复杂,并且如果有其他类使用,修改复杂而且可能发生错误。

问题3)开闭原则code?

******* 业务需求:现在业务扩展,要对Java课程price进行打折。**
*** 开闭原则:不能修改原来的类和接口。ICourse接口和javaCourse类**
*** 业务需求:现在业务扩展,要对Java课程price进行打折。**
*** 开闭原则:不能修改原来的类和接口**。**

版本1,**可以在接口中添加打折方法discountCourse()。让JavaCourse方法实现。

*** 这样虽然实现了,既能获取原价,又能获取打折价。但如果继承Icourse接口的课程很多。就需要一个个的实现类进行修改。也失去了接口的规范功能。**
版本2,******如果在JavaCourse类中直接对getPrice * 0.8。也可以进行打折。

  • 但是原价的获取方法就没有了。并且可能该类很复杂,如果直接在原来的类中修改。
  • 可能引起错误。

*** 版本3****,本着开闭原则,只扩展,不修改。可以写一个javaDisCourse类继承javaCourse类。**

*** 在javaDisCourse方法中添加打折方法。这样就遵循开闭原则。原来的ICourse接口和javaCourse类都没有修改。**

*** 注意:引用类型iCourse只调用实现类的继承的方法。不会调用实现类非继承方法。**

*** 如果想调用实现类非继承方法,就需要进行强制转换。**

原来的类结构图:

开闭原则之后的类结构图:

实例:

课程接口
public interface ICourse {
    //课程id,名称,价格
    Integer getId();
    String getName();
    Double getPrice();
}
java课程实现课程接口 

public class javaCourse implements ICourse {
    int id;
    String name;
    Double price;

    public javaCourse(int id, String name, Double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

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

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

    public Double getPrice() {
        return this.price;
    }
}
java打折课程实现类,继承java课程
public class JavaDiscountCourse extends javaCourse {
    public JavaDiscountCourse(int id, String name, Double price) {
        super(id, name, price);
    }

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

}
0人推荐
随时随地看视频
慕课网APP