开闭原则
1.1 定义:
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
用抽象构建框架,用实体扩展细节。
1.2 优点;
提高软件系统的可复用性及可维护性。
1.3 问题由来:
在软件的生命周期中,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码进过重新测试。
1.4 解决方案:
当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
实现开闭原则的重点是面向抽象编程。
1.5 代码演示:
有一个接口:
- ICourse.java
package com.design.principle.openclose;
/**
* @Author: JLU Tiger
* @Date: 2019/8/28 16:13
*/
public interface ICourse {
Integer getId();
String getName();
Double getPrice();
}
实现类:
- JavaCourse.java
package com.design.principle.openclose;
/**
* @Author: JLU Tiger
* @Date: 2019/8/28 16:15
*/
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 this.id;
}
public String getName() {
return this.name;
}
public Double getPrice() {
return this.price;
}
}
测试类:
- Test.java
package com.design.principle.openclose;
/**
* @Author: JLU Tiger
* @Date: 2019/8/28 16:17
*/
public class Test {
public static void main(String[] args) {
ICourse javaCourse = new JavaCourse(96, "Java从零到企业级开发", 348d);
System.out.println("课程id:" + javaCourse.getId() + "课程名称:" + javaCourse.getName()
+ "课程价格:" + javaCourse.getPrice());
}
}
当我们要进行打折的时候,应该怎么做呢?
在接口中增加一个打折的函数:
package com.design.principle.openclose;
/**
* @Author: JLU Tiger
* @Date: 2019/8/28 16:13
*/
public interface ICourse {
Integer getId();
String getName();
Double getPrice();
Double getDiscountPrice();
}
并在java课程中实现该方法:
public Double getDiscountPrice() {
return this.price * 0.8;
}
但是我们在修改时,修改了接口,当我们的课程类型很多的时候,所有的课程实现类都要实现该方法,我们的接口不应该经常变化,它应该是稳定的。
那么,我们应该怎么办呢?如果不修改接口,通过扩展增加一个java打折类呢?
- JavaDiscountCourse.java
package com.design.principle.openclose;
/**
* @Author: JLU Tiger
* @Date: 2019/8/28 16:29
*/
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;
}
}
如果要获得原价的话,需要在折扣方法中添加:
package com.design.principle.openclose;
/**
* @Author: JLU Tiger
* @Date: 2019/8/28 16:29
*/
public class JavaDiscountCourse extends JavaCourse {
public JavaDiscountCourse(Integer id, String name, Double price) {
super(id, name, price);
}
public Double getOriginPrice() {
return super.getPrice();
}
@Override
public Double getPrice() {
return super.getPrice() * 0.8;
}
}
在使用的时候,获取原价的时候需要强转:
package com.design.principle.openclose;
/**
* @Author: JLU Tiger
* @Date: 2019/8/28 16:17
*/
public class Test {
public static void main(String[] args) {
ICourse iCourse = new JavaDiscountCourse(96, "Java从零到企业级开发", 348d);
JavaDiscountCourse javaCourse = (JavaDiscountCourse) iCourse;
System.out.println("课程id:" + javaCourse.getId() + " 课程名称:" + javaCourse.getName()
+ " 课程折后价:" + javaCourse.getPrice() + " 课程原价:" + javaCourse.getOriginPrice());
}
}
以上便是开闭原则的简单使用。