极速入门了UML类图之后,我们不着急开启设计模式之旅,我们先来探讨一下软件设计的七大原则,为什么要探讨这个,其实无论哪种设计模式,都是在这七大原则中进行了相应的取舍才逐渐形成的,因此七大原则是指导我们怎么用设计模式以及编写代码的基本原则。本文先来了解一下开闭原则。

定义

  • 定义:一个软件实体如类,模块和函数应该对扩展开放,对修改关闭
  • 用抽象构建框架,用实现扩展细节
  • 优点:提高软件系统的可复用性和可维护性

例子

比如一个简单场景:有一个课程,原价200,现在双十一打八折,那么这个打折功能如何添加上去呢?

平时这个java课程是这样写的:

1
2
3
4
5
public interface ICourse {
Integer getId();
String getName();
double getPrice();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class JavaCourse implements ICourse{
private int id;
private String name;
private double price;

public JavaCourse() {
}

public JavaCourse(int 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;
}
}
1
2
3
4
5
6
7
public class Test {
public static void main(String[] args) {
ICourse javaCourse = new JavaCourse(1,"好看的课",200.00);
System.out.println("课程id:"+javaCourse.getId()+",课程的名称:"+javaCourse.getName()+",课程的价格:"+javaCourse.getPrice());

}
}

此时,要在双十一搞活动,需要对这个价格限时打折,该怎么做?

比较简单的方法是:直接在接口上新建一个方法,然后重新实现这个打折的方法,最后再调用这个方法;这显然违背了我们这里对修改封闭的原则,接口是一种契约,不应该随便更改

那么直接在实现类上面的getPrice()方法里面乘0.8?这显然也一样不行。

⭐⭐⭐这个时候,需要新建一个这个课程打折的类discountJavaCourse继承javaCourse:

1
2
3
4
5
6
7
8
9
public class DiscountJavaCourse extends JavaCourse{
public DiscountJavaCourse(int id, String name, double price) {
super(id, name, price);
}

public double getDiscountPrice(){
return super.getPrice()*0.8;
}
}

然后在调用的时候,因为是父类声明的引用,需要强转一下,否则拿不到这个扩展的方法:

1
2
3
4
5
6
7
8
9
10
11
public class Test {
public static void main(String[] args) {
// ICourse javaCourse = new JavaCourse(1,"好看的课",200.00);
// System.out.println("课程id:"+javaCourse.getId()+",课程的名称:"+javaCourse.getName()+",课程的价格:"+javaCourse.getPrice());

ICourse iCourse = new DiscountJavaCourse(1,"好看的课",200.00);
DiscountJavaCourse discountJavaCourse = (DiscountJavaCourse)iCourse;
System.out.println("课程id:"+discountJavaCourse.getId()+",课程的名称:"+discountJavaCourse.getName()+",原价:"+discountJavaCourse.getPrice()+",折后价为:"+discountJavaCourse.getDiscountPrice());

}
}

从而达到了对于扩展开放,对于修改封闭的效果。因为越基层的类所影响的东西越多,所以不要去动他。