设计模式之__开闭原则
Posted 一起写程序
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之__开闭原则相关的知识,希望对你有一定的参考价值。
问题1)开闭原则,最基层的原则。
开闭原则:一个软件实体如类,模块,函数应该对扩展开发,对修改关闭(只扩展不修改)。对修改行为的约束。
开闭原则的实现方法:面向抽象编程,对业务进行抽象,写的都是抽象方法或者类。(不去修改原有的,不写具体的实现,而是在欲言又止的基础上进行添加或实现。)
优点:高复用和易维护。
问题2)为什么开闭原则只扩展,不修改呢?
只扩展不修改。(越基层的影响越大,越表层的影响越小)
修改原来接口,就得修改所有继承该接口的类,失去了接口规范的作用,并且非常复杂。
修改原来的类,如果该类非常复杂,并且如果有其他类使用,修改复杂而且可能发生错误。
问题3)开闭原则coding?
* 业务需求:现在业务扩展,要对Java课程price进行打折。
* 开闭原则:不能修改原来的类和接口。ICourse接口和javaCourse类
/**
* 业务需求:现在业务扩展,要对Java课程price进行打折。
* 开闭原则:不能修改原来的类和接口。
*
* 版本1,可以在接口中添加打折方法discountCourse()。让JavaCourse方法实现。
* 这样虽然实现了,既能获取原价,又能获取打折价。但如果继承Icourse接口的课程很多。就需要一个个的实现类进行修改。也失去了接口的规范功能。
*
* 版本2,如果在JavaCourse类中直接对getPrice * 0.8。也可以进行打折。
* 但是原价的获取方法就没有了。并且可能该类很复杂,如果直接在原来的类中修改。
* 可能引起错误。
* 版本3,本着开闭原则,只扩展,不修改。可以写一个javaDisCourse类继承javaCourse类。
* 在javaDisCourse方法中添加打折方法。这样就遵循开闭原则。原来的ICourse接口和javaCourse类都没有修改。
*
* 注意:引用类型iCourse只调用实现类的继承的方法。不会调用实现类非继承方法。
* 如果想调用实现类非继承方法,就需要进行强制转换。
*/
public class test {
public static void main(String[] args) {
// ICourse iCourse = new javaCourse(123,"java课程",350d);
ICourse iCourse = new JavaDiscountCourse(123,"java课程",350d);
JavaDiscountCourse javacourse = (JavaDiscountCourse)iCourse;
System.out.println("课程id:"+javacourse.getId()+" 课程名:"+javacourse.getName()+" 打折课程价格"+javacourse.getPrice()+" 原来的价格"+javacourse.getOrignPrice());
}
}
原来的类结构图:
开闭原则之后的类结构图:
实例:
课程接口
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;
}
}
以上是关于设计模式之__开闭原则的主要内容,如果未能解决你的问题,请参考以下文章