单一职责原则 SRP

一个类应该只有一个更改它的原因,也就是这个类只有一个职责

  • 每个类的职责都有清晰明确的定义
  • 一个类的修改只对自身有影响,对其他类没有影响

开闭原则 OCP

软件实体(类 模块 函数)应该可以扩展,但是不能修改.对于扩展是开放的,对于修改是封闭的.
对于要怎讲爱新功能或者需要调整的改动,应该扩展新的代码而不是修改原有的代码.

  • 对程序中频繁变化的部分抽象
  • 不要刻意的对每一个部分都进行抽象,拒绝不成熟的抽象,这和抽象本身一样重要.

依赖倒置原则 DIP

程序不应该依赖细节,细节应该依赖于抽象. 针对接口编程 而不是针对实现编程

  • 使用接口或者抽象类的目的是制定好规范,不涉及任何具体的操作,把细节任务交给实现类去完成
  • 让程序中所有的依赖关系都终止于抽象类或者接口
  • 高层模块不应该依赖底层模块,二者都应该依赖抽象
  • 抽象不应该依赖细节,细节应该依赖抽象

里氏替换原则 LSP

一个软件实体如果适用于父类,必定适用于子类,并且察觉不出子类和父类的区别,也就是子类必须能够替换父类

  • 父类一般使用抽象类或者接口
  • 抽象类定义公共对象和状态;接口定义公共行为
  • 子类通过继承父类和接口进行扩展
  • 子类的方法参数类型 返回值类型 异常 都应该跟父类相匹配;子类不应该强加参数条件限制;子类不能修改父类的私有成员

迪米特原则 LoD

最小知识原则.如果两个类不必彼此互相通信,那么这两个类就不应该发生直接的相互作用;如果其中一个类需要调用另一个类的某一个方法,则可以通过第三者转发这个调用

  • 类设计上,每一个类都应该尽量降低成员的访问权限,不要让别的类知道字段或行为就不要公开
  • 类之间不建立联系,而是通过中间类来中转