1.定义
一个软件实体,如类和方法,应该对扩展开放,对修改关闭。
通俗易懂的说,就是你的软件不能因为加功能,就不断地修改已有的类。而是应该通过增加类,以插拔的方式来实现。举个例子,Macbook的变压器插头是可以替换的,如果说某一天插口的标准换了,那么苹果只需要开发一个新的插头就好了,而不需要重新开发整个变压器。
开闭原则确保了成熟代码最大程度的稳定性以及可维护性。
2.代码示例
(1).需求
public interface ICourse {
Integer getId();
String getName();
Double getPrice();
}
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;
}
@Override
public Integer getId() {
return this.id;
}
@Override
public String getName() {
return this.name;
}
@Override
public Double getPrice() {
return this.price;
}
}
public class Test {
public static void main(String[] args) {
ICourse java = new JavaCourse(100, "从零开始学Java", 388.0);
System.out.println("id:" + java.getId() + ",name:" + java.getName() + ",price:" + java.getPrice());
}
}
id:100,name:从零开始学Java,price:388.0
(2).开放修改
需求变更,增加获取课程原价的功能。
public interface ICourse {
Integer getId();
String getName();
Double getPrice();
}
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;
}
@Override
public Integer getId() {
return this.id;
}
@Override
public String getName() {
return this.name;
}
@Override
public Double getPrice() {
return this.price;
}
}
public class Test {
public static void main(String[] args) {
ICourse java = new JavaCourse(100, "从零开始学Java", 388.0);
System.out.println("id:" + java.getId() + ",name:" + java.getName() + ",price:" + java.getPrice());
}
}
id:100,name:从零开始学Java,discountPrice:310.40000000000003
修改了接口里面的内容,违背了开闭原则。
(3).关闭修改
public class JavaDisCountCourse extends JavaCourse {
public JavaDisCountCourse(Integer id, String name, Double price) {
super(id, name, price);
}
@Override
public Double getPrice() {
return super.getPrice() * 0.8;
}
public Double getOriginalPrice() {
return super.getPrice();
}
}
public class Test {
public static void main(String[] args) {
ICourse iCourse = new JavaDisCountCourse(100, "从零开始学Java", 388.0);
JavaDisCountCourse javaDisCountCourse = (JavaDisCountCourse) iCourse;
System.out.println("id:" + iCourse.getId() + ",name:" + iCourse.getName() + ",originalPrice:" + javaDisCountCourse.getOriginalPrice() + ",disCountPrice:" + iCourse.getPrice());
}
}
id:100,name:从零开始学Java,originalPrice:388.0,disCountPrice:310.40000000000003
接口没有变,实现类也没有变,通过定义一个新类进行了扩展,防止了风险扩散。