开闭原则就是在软件开发过程中对扩展开放,对修改关闭;强调用抽象构建框架,用实现扩展细节,可提高软件的可用性及可维护性;开闭原则的核心思想就是面向抽象编程
比如当我们软件开发过程中,如果要更改某一功能,不需要更改原先类稳定的代码,只需要继承该类,在新的类中增加相应的修改的功能即可,案例代码如下:
我们学校有许多的课程,其中有一门课程为java课程,我们需要打印出该课程的id、名称以及售价;
1.为此我们新建一个接口类ICourse和实现类JavaCourse,JavaCourse实现接口ICourse
ICourse:
public interface ICourse {
Integer getId();
String getName();
Double getPrice();
}
JavaCourse:
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 this.id;
}
@Override
public String getName() {
return this.name;
}
@Override
public Double getPrice() {
return this.price;
}
}
2.测试方法如下:
public class OpenCloseTest {
public static void main(String[] args) {
ICourse iCourse = new JavaCourse(1,"java课程",1000D);
System.out.println("课程ID="+iCourse.getId()+
"\n课程名称="+iCourse.getName()+
"\n课程售价"+iCourse.getPrice());
}
}
得到的结果如下
这个例子中,子类的对象实现了父类的相关方法,在测试类中,打印了课程的ID、名称、售价等;
3.此时,正好赶上节日,我们有一个促销活动,JAVA课程我们打六折
如果每次打折我们都修改JavaCourse类的代码显然是不合理的,这样破坏了原本稳定的代码
此时,只需要我们新建一个JavaDiscountCourse类继承JavaCourse,并在JavaDiscountCourse新增加一个打折的代码即可,如下:
public class JavaDiscountCourse extends JavaCourse {
public JavaDiscountCourse(Integer id, String name, Double price) {
super(id, name, price);
}
public Double getDiscountPrice() {
return super.getPrice()*0.6;
}
}
新的打折方法为getDiscountPrice;同时注意构造方法的继承
4.测试方法如下:
public class OpenCloseTest {
public static void main(String[] args) {
ICourse iCourse = new JavaDiscountCourse(1,"java课程",1000D);
JavaDiscountCourse javaDiscountCourse = (JavaDiscountCourse)iCourse;
System.out.println("课程ID="+javaDiscountCourse.getId()+
"\n课程名称="+javaDiscountCourse.getName()+
"\n课程原价"+javaDiscountCourse.getPrice()+
"\n课程售价"+javaDiscountCourse.getDiscountPrice());
}
}
测试中,因为getDiscountPrice为子类JavaDiscountCourse 独有的,所以要将iCourse强转为JavaDiscountCourse;
JavaDiscountCourse 的类图如下:
此案例中,新的功能没有修改原先类的代码,只是扩展的原先系统的功能,这就是开闭原则