一、开闭原则定义:
一个软件实体如类、模块、函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现实现细节。
- 也就是说我们如果想实现某种变化,不应该修改原类或模块实现相应的功能细节,而是对原类或模块实体进行扩张 继承来具体实现某一变化。
- 一个软件实体在使用过程中许多模块都会不断发生变化,以修改某商品价格为例,如果频繁修改原功能模块,则需要频繁打包上架重启,开闭原则可以提高软件系统的可复用性、灵活性和可维护性。
下面我们用一个例子来理解开闭原则:
先写一个课程接口,定义公共使用的方法
/**
* 定义个课程接口,定义公共行为方法
* getName() 课程名称
* getPrice() 课程价格
*/
public interface ICourse {
Integer getId();
String getName();
Double getPrice();
}
实现一个java课程类实现公共课程接口
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 id;
}
public String getName() {
return name;
}
public Double getPrice() {
return price * 0.8;//常规修改下的课程价格打8折
}
}
写一个main方法测试类
在main方法中初始化一个java课程信息并输出
public class OpenCourseTest {
public static void main(String[] args) {
ICourse course = new JavaCourse(1,"javaEE",99D);
System.out.println("课程ID:" + course.getId() +
"\n课程名称:《" + course.getName() +"》" +
"\n课程价格:" + course.getPrice()
);
}
}
得到如下结果
课程ID:1
课程名称:《javaEE》
课程价格:79.2
- 这样写暴露出一个问题,就是每次使用不同的折扣都需要修改一次JavaCourse类,可能就会造成频繁的原逻辑修改,在复杂的业务中容易出问题。
- 此时,原来的代码我们就不要去修改了,关闭原来代码的修改,扩展原代码,通过继承原代码类实现需求细节的修改。让我们的项目代码风险可控。
我们重写一个打折类,在类中实现细节:
public class JavaDiscountCourse extends JavaCourse{
public JavaDiscountCourse(Integer id, String name, Double price) {
super(id, name, price);
}
//修改后的价格 可加入其他业务逻辑
public Double getDisCountPrice() {
return super.getPrice() * 0.6;//打6折
}
}
再修改main测试类
public class OpenCourseTest {
public static void main(String[] args) {
ICourse course = new JavaDiscountCourse(1,"javaEE",99D);
System.out.println("课程ID:" + course.getId() +
"\n课程名称:《" + course.getName() +"》" +
"\n课程原价:" + course.getPrice() +
"\n课程折价:" + ((JavaDiscountCourse)course).getDisCountPrice()
);
}
}
得到结果如下:
课程ID:1
课程名称:《javaEE》
课程原价:99.0
课程折价:59.4
- 现在打折例子完成了,我们只是增加了一个JavaDiscountCourse 类,我们没有修改底层模块,代码改变量少,可以有效的防止风险的扩散。
- 如果要修改代码中某些逻辑实现细节的变化,尽量避开低层代码的逻辑,如果要修改低层代码,你要确定都有哪些高层次的代码使用了这些低层次代码,做统一的修改,低层次的代码的修改,肯定会引起高层次引用代码的变化,牵一发而动全身。所以尽量使用开闭原则,对原低层次代码进行扩展实现。
- 开闭原则是最基础的设计原则,其他五个原则都是以开闭原则为基础,你也可以这么理解:开闭原则是抽象类,其他五个设计原则是具体实现类,是指导设计的工具和方法。