课程名称: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;
}
}