一、单一职责原则(SRP)

  定义:就一个类而言,应该仅有一个引起它变化的原因。
  简单来说,一个类中应该是一组相关性很高的函数、数据的封装。单一职责的划分界限并不是总是那么清晰,很多时候都是需要靠个人经验来界定。当然,最大的问题就是对职责的定义,什么是类的职责,以及怎么划分类的职责。

二、开闭原则(OCP)

  定义:软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是对于修改是封闭的。
  当软件需要变化时,应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。这里的“应该尽量”4个字说明OCP原则并不是说绝对不可以修改原始类的。在开发过程中需要自己结合具体情况进行考量,是通过修改旧代码还是通过继承使得软件系统更稳定、更灵活,在保证去除“代码腐化”的同时,也保证原有模块的正确性。

三、里式替换原则(LSP)

  定义1:如果对每一个类型为S的对象O1,都有类型为T的对象O2,使得以T定义的所以程序P在所所有的对象O1都代换成O2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。
  定义2:所有引用基类的地方必须能透明的使用其子类的对象。
  原则:依赖于面向对象语言的继承与多态。
  核心原理:抽象,抽象又依赖于继承,在OOP当中继承的优缺点很明显:
  优点:
   (1)代码重用,减少创建类的成本,每个子类都拥有父类的方法与属性。
   (2)子类与父类基本相似,但与父类又有所区别。
   (3)提高代码的可扩展性。
  缺点:
   (1)继承是侵入性的,只要继承就必须拥有父类所有的属性与方法。
   (2)可能造成子类代码冗余、灵活性降低。

四、依赖倒置原则(DIP)

  定义:指代一种特定的解耦方式,使得高层次的模块不依赖于低层次的模块的实现细节的目的,依赖模块被颠倒了。
  关键点:
   (1)高层模块不依赖于低层模块,应该都依赖其抽象。
   (2)抽象不依赖细节。
   (3)细节应依赖抽象。

  在Java中,抽象就是指接口或者抽象类,两者都是不能直接被实例化的;细节就是实现类,实现接口或者继承抽象类而产生的就是细节,其特点就是,可以直接被实例化,也就是可以加上一个关键字new产生的对象。高层模块就是调用端,底层模块就是具体实现类。依赖倒置原则在Java中的表现就是:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的。如果类与类直接依赖细节,那么就会直接耦合,当修具体实现需求变化时,意味着要同时修改依赖者的代码,这限制了系统的可扩展性。

五、接口隔离原则(ISP)

  定义1:客户端不应该依赖它不需要的接口。
  定义2:类间的依赖关系应该建立在最小的接口上,接口隔离原则将非常庞大、臃肿的接口拆分成更小的和更具体的接口。
  目的:系统解开耦合,从而更容易重构、更改和重新部署。

六、迪米特原则(LOD,也成为最少知识原则)

  定义:一个对象应该对其他对象有最少的了解。
  也就是说一个类应该对自己需要耦合或者调用的类知道的最少,类的内部如何实现与调用者或者依赖者没有关系,调用者或依赖者只需知道他需要的方法,其他可以一概不管。类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。