一、单一职责原则

单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则,白话文就是说,一个类里面,完成的功能应该尽可能的少,以免一个类里功能太多,耦合在一起后,后续进行业务扩展时,容易出问题。一个类负责一个功能,那么修改一个类就不会影响到其他类。

二、开闭原则

一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。总体上来说,就是当我需要进行业务扩展时,应该是写其他的类或者接口,而不是将原来的代码进行修改。比如手机开始上2G网,现在扩展一个上4G的网,不应该将原来的代码直接修改,而是另外实现一个上4G网的功能。

三、里氏代换原则

所有引用基类(父类)的地方必须能透明地使用其子类的对象。
首先理解下继承的优缺点:
继承优点

  • 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;提高代码的重用性;子类可以形似父类,但又异于父类;提高代码的可扩展性,实现父类的方法就可以“为所欲为”了;提高产品或项目的开放性。

继承缺点

  • 继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;降低代码的灵活性。子类必须拥有父类的属性和方法;
  • 增强了耦合性。当父类的常量、变量和方法被修改时,必需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果;大片的代码需要重构。

里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。个人理解,和多态比较像,先声明使用父类,然后再决定使用个哪个子类的具体实现。针对基类编程,在程序运行时再确定具体子类。

四、依赖倒置原则

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象,其核心思想是:要面向接口编程,不要面向实现编程。

开闭原则是目标(目的是什么),里氏代换原则是基础(怎么达到这个目的),依赖倒转原则是手段(达到目的的具体步骤)

依赖倒置原则的作用

(1)依赖倒置原则可以降低类间的耦合性。

(2)依赖倒置原则可以提高系统的稳定性。

(3)依赖倒置原则可以减少并行开发引起的风险。

(4)依赖倒置原则可以提高代码的可读性和可维护性。

依赖倒置原则的实现方法

(1)每个类尽量提供接口或抽象类,或者两者都具备。

(2)变量的声明类型尽量是接口或者是抽象类。

(3)任何类都不应该从具体类派生。

(4)使用继承时尽量遵循里氏替换原则

五、接口隔离原则

定义:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

这一点和单一职责比较类似,一个是讲类里面功能要少,一个是说,接口也要分割更更小的接口,而不是少数几个接口实现所有功能。

六、迪米特法则

如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

七、合成复用原则

尽量使用对象组合,而不是继承来达到复用的目的。要知道,并不是只有继承和实现才能完成所有功能,类和类之间的关系还有很多。

总结:

单一职责原则告诉我们实现类要职责单一

依赖倒置原则告诉我们要面向接口编程

接口隔离原则告诉我们在设计接口的时候要精简单一

迪米特原则告诉我们要降低耦合

开闭原则是总纲,告诉我们要对扩展开放,对修改关闭

:并不是所有的设计模式都严格遵守了上面这7个原则。