设计模式七大原则开闭原则
Posted jlutiger
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式七大原则开闭原则相关的知识,希望对你有一定的参考价值。
设计模式七大原则——开闭原则
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());
以上便是开闭原则的简单使用。
以上是关于设计模式七大原则开闭原则的主要内容,如果未能解决你的问题,请参考以下文章