开闭原则

开闭原则

定义

一个软件实体如类,模块和函数应该对扩展开放,对修改关闭

用抽象架构框架,用实现扩展细节

优点

提高软件系统的可复用性以及可维护性

例子

定义一个课程接口

public interface ICourse {
Integer getId();
String getName();
Double gtePrice();
}

定义一个接口实现类
public class JavaCourse implements ICourse {
private Integer id;
private String name;
private Double price;

public JavaCourse(Integer 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 gtePrice() {
return this.price;
}
}

课程要打折了

现在我们要对课程进行打折,那么我们要在接口增加一个打折后的价格的方法,这样显然就显得很麻烦,如果我们有很多课程,那么就有很多实现类需要被修改,接口作为一种契约经常修改显然不合理
public interface ICourse {
Integer getId();
String getName();
Double gtePrice();
Double getDiscountPrice();
}
public class JavaCourse implements ICourse {
private Integer id;
private String name;
private Double price;

public JavaCourse(Integer 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 gtePrice() {
return this.price;
}

/**
* 获取打折后的价格
* @return 打折价
*/
public Double getDiscountPrice() {
return this.price * 0.8;
}
}

更好的修改方式

直接继承JavaCourse,重写getPrice()的价格,但是这样原价就没有了

public class JavaDiscountCourse extends JavaCourse {
public JavaDiscountCourse(Integer id, String name, Double price) {
super(id, name, price);
}
@Override
public Double gtePrice() {
return super.gtePrice() * 0.8;
}
}

再添加一个获取原价的方法
public class JavaDiscountCourse extends JavaCourse {
public JavaDiscountCourse(Integer id, String name, Double price) {
super(id, name, price);
}

/**
* 获取折后价格
* @return
*/
@Override
public Double gtePrice() {
return super.gtePrice() * 0.8;
}

/**
* 获取原价
* @return
*/
public Double getOriginPrice(){
return super.gtePrice();
}
}

测试类
public class Test {
public static void main(String[] args) {
ICourse javaCourse = new JavaDiscountCourse(96,"我是Java",348d);
JavaDiscountCourse javaDiscountCourse = (JavaDiscountCourse) javaCourse;
//这个在实际项目中是禁止的,因为它有同步锁
System.out.println("课程id:" + javaDiscountCourse.getId() +
", name:" +javaDiscountCourse.getName()+
",课程原价:" + javaDiscountCourse.getOriginPrice() +
",折后价格:" + javaDiscountCourse.gtePrice());
}
}


输出:

课程id:96, name:我是Java,课程原价:348.0,折后价格:278.4

这样我们既实现了对Java课程的扩展也不用修改接口,符合对扩展开放对修改关闭。


 




posted @ 2020-03-26 18:51  叫熊猫啊  阅读(166)  评论(0编辑  收藏  举报