【设计模式】软件设置原则-开闭原则

简介: 【1月更文挑战第12天】【设计模式】软件设置原则-开闭原则

开闭原则(Open Closed PrincipleOCP的定义是:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。模块应尽量在不修改原(是"原",指原来的代码)代码的情况下进行扩展。

1.1 开闭原则 意义:

在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。

1.2 开闭原则 实现:

要实现对扩展开放,对修改关闭,即遵循开闭原则,需要对系统进行抽象化设计抽象可以基于抽象类或者接口。一般来说需要做到几点:

  1. 通过接口或者抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法,也就是扩展必须添加具体实现而不是改变具体的方法。
  2. 参数类型、引用对象尽量使用接口或者抽象类,而不是实现类,这样就能尽量保证抽象层是稳定的。
  3. 一般抽象模块设计完成(例如接口的方法已经敲定),不允许修改接口或者抽象方法的定义。

下面通过一个例子遵循开闭原则进行设计,场景是这样:某系统的后台需要监测业务数据展示图表,如柱状图、折线图等,在未来需要支持图表的着色操作。在开始设计的时候,代码可能是这样的:

public class BarChart {
  public void draw(){
    System.out.println("Draw bar chart...");
  }
}
public class LineChart {
  public void draw(){
    System.out.println("Draw line chart...");
  }
}
public class App {
  public void drawChart(String type){
    if (type.equalsIgnoreCase("line")){
      new LineChart().draw();
    }else if (type.equalsIgnoreCase("bar")){
      new BarChart().draw();
    }
  }
}

这样做在初期是能满足业务需要的,开发效率也十分高,但是当后面需要新增一个饼状图的时候,既要添加一个饼状图的类,原来的客户端App类的drawChart()方法也要新增一个else if分支,这样做就是修改了原有客户端类库的方法,是十分不合理的。

如果这个时候,在图中加入一个颜色属性,复杂性也大大提高。基于此,需要引入一个抽象ChartAbstractChartApp类在画图的时候总是把相关的操作委托到具体的AbstractChart的派生类实例,这样的话App类的代码就不用修改:

public abstract class AbstractChart {
  public abstract void draw();
}
public class BarChart extends AbstractChart{
  @Override
  public void draw() {
    System.out.println("Draw bar chart...");
  }
}
public class LineChart extends AbstractChart {
  @Override
  public void draw() {
    System.out.println("Draw line chart...");
  }
}
public class App {
  public void drawChart(AbstractChart chart){
    chart.draw();
  }
}

如果新加一种图,只需要新增一个AbstractChart的子类即可。客户端类App不需要改变原来的逻辑。修改后的设计符合开闭原则,因为整个系统在扩展时原有的代码没有做任何修改。

相关文章
|
3月前
|
设计模式
设计模式七大原则
这篇文章介绍了设计模式中的七大原则,特别强调了单一职责原则,即一个类应该只有一个引起其行为变化的原因,以确保类功能的高内聚和低耦合。
|
3月前
|
设计模式 存储 前端开发
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
|
2月前
|
设计模式 Java 关系型数据库
设计模式——设计模式简介和七大原则
设计模式的目的和核心原则、单一职责原则、接口隔离原则、依赖倒转原则、里氏替换原则、开闭原则、迪米特法则、合成复用原则
设计模式——设计模式简介和七大原则
|
5月前
|
设计模式 供应链
设计模式六大原则之迪米特法则
设计模式六大原则之迪米特法则
|
3月前
|
设计模式 算法 开发者
设计模式问题之最小知识原则(迪米特法则)对代码设计有何影响,如何解决
设计模式问题之最小知识原则(迪米特法则)对代码设计有何影响,如何解决
|
3月前
|
设计模式 前端开发 JavaScript
React开发设计模式及原则概念问题之什么是HOC(Higher-order component),HOC遵循的设计原则都有哪些
React开发设计模式及原则概念问题之什么是HOC(Higher-order component),HOC遵循的设计原则都有哪些
|
3月前
|
设计模式 前端开发 JavaScript
React开发设计模式及原则概念问题之什么是设计模式,单一职责原则如何理解
React开发设计模式及原则概念问题之什么是设计模式,单一职责原则如何理解
|
5月前
|
设计模式 uml
设计模式学习心得之前置知识 UML图看法与六大原则(下)
设计模式学习心得之前置知识 UML图看法与六大原则(下)
37 2
|
5月前
|
设计模式 Java 数据库
深入理解设计模式六大原则
深入理解设计模式六大原则
|
5月前
|
设计模式 数据可视化 程序员
设计模式学习心得之前置知识 UML图看法与六大原则(上)
设计模式学习心得之前置知识 UML图看法与六大原则(上)
42 0