设计模式 - SOLID原则

面向对象编程(OOP)的五个基本原则,利于程序更低耦合,更易维护

  • 单一职责SRP (Single Responsibility Principle)
  • 开闭原则OCP (Open-Closed Principle)
  • 里氏替换LSP (Liskov Substitution Principle)
  • 接口隔离ISP (Interface Segregation Principle)
  • 依赖倒置DIP (Dependence Inversion Principle)

单一职责SRP

就一个类而言,应该仅有一个引起它变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。如果你能够想到多于一个动机去改变一个类,那么这个类就具有多于一个的职责,就需要考虑类的职责分离。

SRP一个明显的好处就是代码的粒度降低,职责分明,更易定位及维护。

开闭原则OCP

开闭原则的两个特征:

  1. 对拓展开放 (open for extension)
  2. 对修改关闭 (closed for modification)

当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现。

开闭原则是面向对象设计的核心。遵循这个原则,可以使面向对象编程真正的变成可维护、可拓展、可复用、灵活性好的编程思想。开发人员应该仅对程序中呈现出频繁变化的哪些部分做出抽象。抽象实现架构,实现扩展细节。要求抽象对需求有前瞻性和预见性

里氏替换LSP

一个对象在其出现的任何地方,都可以用其子类实例做替换,并且不会导致程序的错误。

这个特性与对象的继承密切相关。

继承的优点:

  1. 子类拥有父类所有的方法和属性,从而可以减少创建类的工作量
  2. 提供代码重用性
  3. 提供代码拓展型,子类不仅有父类的方法,还能添加自己的功能
    继承的缺点:
  4. 继承是有侵入性的。子类不得不拥有父类所有的属性和方法
  5. 降低了代码的灵活性,父类对子类造成约束
  6. 增强了耦合,父类代码修改时,必须考虑对子类产生的影响

里氏替换原则对继承进行了规则约束:

  1. 子类必须实现父类的抽象方法,但不得重写(覆盖)父类的非抽象(已实现)方法
  2. 子类中可以增加自己特有的方法
  3. 当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松
  4. 当子类的方法实现父类的(抽象)方法时,方法的后置条件(即方法的返回值)要比父类更严格

接口隔离ISP

接口隔离的两个特征:

  1. 客户端不应该依赖他不需要的接口
  2. 类之间的依赖关系应该建立在最小的接口上

接口隔离与单一职责是息息相关的:
接口隔离解决的问题面向接口、抽象、程序整体,而单一职责重视的是对类的约束,针对功能实现。
实现接口隔离,接口粒度要降低,首先要满足接口的单一职责原则。

依赖倒置DIP

依赖倒置的两个特征:

  1. 上层模块不依赖底层模块,都依赖抽象
  2. 抽象不依赖细节,细节依赖抽象