开闭原则

Posted zw-2371blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开闭原则相关的知识,希望对你有一定的参考价值。

视频连接地址:https://www.bilibili.com/video/BV1h7411y7ED

 

开闭原则

定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

总结:用抽象构建框架,用实现扩展细节

优点:提高软件系统的可复用性及可维护性

 

假设场景一:接口A里面定义了一个书本的基本信息,但是具体是什么书我们暂时不知道,用抽象来构建框架

代码实现:

1.定义接口–Ibook用接口来抽象定义一本书的大概信息

public interface Ibook {

  Integer getId();

  String getName();

  Double getPrice();

}

2.接口实现-根据自己的要求来完善具体细节,但是无法改变下层接口架构

public class JavaBook implements Ibook {
  private Integer Id;
  private String name;
  private Double price;

  public JavaBook(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;
  }
}
3.调用测试

Ibook ibook = new JavaBook(1,"java从入门到精通",48.00);
System.out.println("课程ID:" + ibook.getId() + " 课程名称:" + ibook.getName() + " 课程原价:" + ibook.getPrice() );

 

假设场景二:此时某一本书不仅要显示其价格,更因为赶上什么活动其书本要进行打折活动,所有书本一律八折,这时要显示的就不是书本的原价了

public Double getPrice() { return this.price*0.8; }

如上可显示折后价格,但是boss又提需求了说你只显示打折后的价格,买家怎么知道原价,不知道原价怎么知道自己赶上活动了呢?

?

解决方案一:在接口再定义一个打折的处理函数,那么就需要考虑此接口如果有多个实现类那么所有实现类都需要添加这个方法,有的书本不在活动中的话就会产生多余函数

? 结论:1.所有实现类都需要实现

? 2.有的书本可能不在本次打折活动中

? 3.需要考虑活动过后是否有存在的必要
解决方案二:对其实现类进行扩展

public class JavaDiscountBook extends JavaBook{

  public JavaDiscountBook(Integer id, String name, Double price){
    super(id,name,price);
  }

  public Double getDiscountPrice(){
    return super.getPrice()*0.8;
  }
}
调用测试,额外扩展,不修改任何基础上实现,活动过后可舍弃不对原有系统框架有任何影响

以上是关于开闭原则的主要内容,如果未能解决你的问题,请参考以下文章

开闭原则——面向对象程序设计原则

面向对象原则之一 开放封闭原则(开闭原则)

开闭原则

设计模-设计原则-开闭原则

七大设计原则之开闭原则应用

设计模式软件设计七大原则 ( 开闭原则 )