一、概念
1、定义:
- 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节
2、简单理解定义:
- 当软件需要变化时,尽量通过扩展软件实体的行为类实现变化,而不是通过修改已有代码来实现变化
3、优点:
- 提高软件系统的可复用性及维护性
1、示例1
- 不使用开闭原则,j计算出课程的id、名称和价格
(1)、定义一个课程接口
package com.rf.rules;
/**
* @Description: 定义一个课程接口
* @Param:
* @Author: xz
* @return:
* @Date: 2020/5/2 17:42
*/
public interface ICourse {
//获取课程id
Integer getId();
//获取课程名称
String getName();
//获取课程价格
Double getPrice();
}
(2)定义一个java课程类实现课程接口,并重写方法
package com.rf.rules;
/**
* @description: java课程类实现课程接口,并重写方法
* @author: xiaozhi
* @create: 2020-05-02 17:43
*/
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;
}
}
(3)定义一个测试类,测试获取课程相关信息
package com.rf.rules;
/**
* @description: 测试类
* @author: xiaozhi
* @create: 2020-05-02 17:58
*/
public class Test {
public static void main(String[] args) {
ICourse iCourse=new JavaCourse(1,"java课程",300d);
System.out.println("java课程id:"+iCourse.getId()+" \n"+"java课程名称:"+iCourse.getName()+" \n"+"java课程价格:"+iCourse.getPrice());
}
(4)输出结果如下: 2、示例2:
- 使用开闭原则,在不改变示例1的代码基础上,计算出打折后的java课程价格
(1)、定义一个课程接口
package com.rf.rules;
/**
* @Description: 定义一个课程接口
* @Param:
* @Author: xz
* @return:
* @Date: 2020/5/2 17:42
*/
public interface ICourse {
//获取课程id
Integer getId();
//获取课程名称
String getName();
//获取课程价格
Double getPrice();
}
(2)、定义一个java课程类实现课程接口,并重写方法
package com.rf.rules;
/**
* @description: java课程类实现课程接口,并重写方法
* @author: xiaozhi
* @create: 2020-05-02 17:43
*/
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;
}
}
(3)定义一个java的扩展类,java的折扣价格课程(在示例1的基础上多了一个java折扣价格类)
package com.rf.rules;
/**
* @description: java的扩展类,java的折扣价格课程
* @author: xiaozhi
* @create: 2020-05-02 18:02
*/
public class JavaDiscountCourse extends JavaCourse{
public JavaDiscountCourse(Integer id, String name, Double price) {
super(id, name, price);
}
//获取java打8折的折扣价
@Override
public Double getPrice(){
return super.getPrice()*0.8;
}
//获取原价
public Double getOriginPrice(){
return super.getPrice();
}
}
(4)定义一个测试类,测试获取课程相关信息及折扣的价格
package com.rf.rules;
/**
* @description: 测试类
* @author: xiaozhi
* @create: 2020-05-02 17:58
*/
public class Test {
public static void main(String[] args) {
ICourse iCourse=new JavaDiscountCourse(1,"java课程",300d);
JavaDiscountCourse javaDiscountCourse=(JavaDiscountCourse)iCourse;
System.out.println("java课程id:" + javaDiscountCourse.getId() + " \n" + "java课程名称:" + javaDiscountCourse.getName() + " \n" + "java课程原价格:" + javaDiscountCourse.getOriginPrice() + " \n" + "java课程折扣价格:" + javaDiscountCourse.getPrice());
}
}
(5)输出结果如下:
当我们的java课程类(JavaCourse)增加折扣价格功能的时候,通过创建一个java折扣课程类(JavaDiscountCourse)来扩展java课程类的功能,尽量通过扩展软件实体的行为类实现变化,而不是通过修改已有代码来实现变化。