极速入门了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 iCourse = new DiscountJavaCourse(1,"好看的课",200.00); DiscountJavaCourse discountJavaCourse = (DiscountJavaCourse)iCourse; System.out.println("课程id:"+discountJavaCourse.getId()+",课程的名称:"+discountJavaCourse.getName()+",原价:"+discountJavaCourse.getPrice()+",折后价为:"+discountJavaCourse.getDiscountPrice());
} }
|
从而达到了对于扩展开放,对于修改封闭的效果。因为越基层的类所影响的东西越多,所以不要去动他。