注意:设计原则是设计模式的前提,写代码尽可能的考虑,有时候要舍弃一些东西。
1. 开闭原则
是指一个软件实体如类、模块和函数应该对扩展开放, 对修改关闭。
比如一个系统已经上线了,新增了业务或者需求,这时,不能去修改原有的代码,因为不知道这些代码在哪里使用了,如果去修改了,是极大的风险,系统变得不稳定。
Demo: 以学习课程为例
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 id;
}
@Override
public String getName() {
return name;
}
@Override
public Double getPrice() {
return price;
}
}
// 测试类
public class MainTest {
public static void main(String[] args) {
ICourse course = new JavaCourse(1,"java",23D);
System.out.println("课程价格: " + course.getPrice());
}
}
以上代码很完美,但是如果现在JAVA课程打折,获取打折价格咋办?
一看就很简单啊,我们可以在JavaCourse类里加一个打折价格的方法,但是这样就违背了开闭原则,那如果是新建一个类继承JavaCourse类呢?
public class JavaDisCountCourse extends JavaCourse {
public JavaDisCountCourse(Integer id, String name, Double price) {
super(id, name, price);
}
// 我们新加了一个方法,并没有直接重写父类的getPrice方法,
//这里涉及到里氏替换原则,看后面文章。如果我直接重写,
//那么我又想获取打折后的价格,又想获取原价,重新就无法满足了
public Double getDiscountPrice() {
return super.getPrice() * 0.8;
}
}
// 测试类
public class MainTest {
public static void main(String[] args) {
JavaDisCountCourse course = new JavaDisCountCourse(1,"java",23D);
System.out.println("课程打折后的价格: " + course.getDiscountPrice() + "--- 课程的原价:"+ course.getPrice());
}
}
开闭原则是最终目标,在实际过程中由于人力,时间,成本等因素不可能百分百的做到。
优点:
可以提供软件复用性,提高系统稳定性
缺点:
可能导致类的膨胀