Skip to content

面向对象的七大设计原则

原文链接

单一职责原则 Single Responsibility Principle, SRP

一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。

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

类的职责主要包括两个方面:数据职责和行为职责,数据职责通过其属性来体现,而行为职责通过其方法来体现。

开闭原则 Open-Closed Principle, OCP

一个软件实体应当对扩展开放,对修改关闭。也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。

里氏代换原则 Liskov Substitution Principle, LSP

在软件中如果能够使用基类对象,那么一定能够使用其子类对象。

里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

依赖倒转原则 Dependence Inversion Principle, DIP

要针对接口编程,不要针对实现编程。

简单来说,依赖倒转原则就是指:代码要依赖于抽象的类,而不要依赖于具体的类;要针对接口或抽象类编程,而不是针对具体类编程。

如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要手段。

接口隔离原则 Interface Segregation Principle, ISP

接口隔离原则是指使用多个专门的接口,而不使用单一的总接口。每一个接口应该承担一种相对独立的角色,不多不少,不干不该干的事,该干的事都要干。

应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。

要定义“瘦接口”,不要定义“胖接口”。

合成复用原则 Composite Reuse Principle, CRP

又称为组合/聚合复用原则(Composition/ Aggregate Reuse Principle, CARP)。

尽量使用对象组合,而不是继承来达到复用的目的。

简言之:要尽量使用组合/聚合关系,少用继承。

迪米特法则 Law of Demeter, LoD

又称为最少知识原则(Least Knowledge Principle, LKP)。

  1. 不要和“陌生人”说话。英文定义为:Don’t talk to strangers.
  2. 只与你的直接朋友通信。英文定义为:Talk only to your immediate friends.
  3. 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。英文定义为:Each unit should have only limited knowledge about other units: only units “closely” related to the current unit.

在迪米特法则中,对于一个对象,其朋友包括以下几类

  1. 当前对象本身(this)
  2. 以参数形式传入到当前对象方法中的对象
  3. 当前对象的成员对象
  4. 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友
  5. 当前对象所创建的对象

任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。