程序设计的要遵循的一些理论,也可以理解为程序设计的一种要求和目标,是面向对象程序设计的基石,也是面向对象程序设计的质量保障和依据

单一职责原则

解释:

  • 系统中的每个类都应该只有一个职责,而所有类所关注的就是自身之职责的完成,就是一个类只干自己相关职责的活,其它的我不管
  • 如果一个类有多个职责,这些职责就耦合在了一起,当一个职责发生变化时,可能会影响其他职责
  • 多个职责耦合在一起,会影响服用性(可能只需要服用该类的某一个功能,但是该职责和其他职责耦合在一起,很难分离出来)
  • 其实就是我们常说的高内聚低耦合原则,单一职责原则是最简单也非常难实现的原则

好处
将功能分类,模块划分明确,修改一个模块不会造成其他模块的修改,降低模块之间的耦合度

举例:
MVC模式下,无论是Controller层还是service亦或是DAO层,针对每个表都有独立的实现类,不要掺杂在一起,以免因为任何一个操作的变化都引起类的修改

图解:
饭店老板 既当厨师,又当服务员,这不合适
image.png

开闭原则

对功能的拓展开放,对修改关闭的原则,因为需求有变化,要求我们设计程序时必须为程序功能的新增留好接口,在新增功能时,不要修改原有代码,而是新增代码,让程序实现对拓展开放,对修改关闭的设计要求

好处:

  • 通过扩展已有软件系统,可以提供新的行为,以满足对软件新的需求,提高了软件系统的适应性和灵活性
  • 已有的软件模块,特别是重要的抽象层模块不能再修改,提高了软件系统的一定的稳定性和延续性
  • 这样的设计同时也满足了可复用性和可维护性

举例:
MVC模式下,每一层都有接口,是和其他层对接的规范,新增功能时,我们可以选择新增Controller层和service层和mapper层代码 不用去修改原有代码

里氏代换原则

凡是父类出现的地方,其子类就可以出现,反过来就不行,子类出现的地方父类未必就能使用

  • 子类必须完全实现了父类的方法,具备父类完全的功能
  • 子类可以有自己的特征
  • 覆盖和实现父类方法时,输入的参数可以被放大,但是不能被缩小,这个有点疑惑
  • 覆盖和实现父类方法时,输出的结果可以被缩小,但是不能被放大
  • 覆盖和实现父类方法时,产生的异常可以被缩小,但是不能被放大

依赖倒置原则

一个类依赖另一个类作为属性时,应尽量选择抽象类或者是接口,尽量避免直接依赖实现类

电脑里的零件坏了,如硬盘,内存,CPU等,那么直接更换对应的配件,只要插槽一样就能互换,维护比较方便.插槽就是接口,具体的硬件就是实现类。留好接口可以随时换零件,如果插槽只能是适用于某个牌子的零件,那么只能买这个牌子的零件

接口隔离原则

建立单一接口,不要建立庞大臃肿的接口,也就是说要为各个类建立专门的接口,而不要试图去建立一个庞大的接口供所有的依赖它的类去调用

接口隔离原则使用的一些规范
接口尽量小,尽量细致
接口尽量高内聚,尽量和其他接口撇清关系

举例:
演员和角色以及整部戏的关系

图解:
不满足接口隔离原则的情况
image.png

满足接口隔离原则的情况
image.png

合成/聚合复用原则

当一个类想使用另一个类的功能时,优先使用对象的组合,而不是继承,尽量多使用组合

为什么要是用合成聚合,尽量不要使用继承?

  • 继承破坏包装,把超类的实现细节直接暴露给子类,不利于信息的隐匿
  • 如果父类发生改变,会引发一系列子类的改变,类之间耦合度高
  • 继承是一种静态功能的使用,在运行的过程中不能发生改变,聚合复用可以动态传入子类对象实现功能动态改变

好处:
非常有利于构建可维护,可复用,可扩展和灵活性好的软件系统

举例:
汽车上如果想获得行车记录的功能,单独组合一个行车记录仪对象作为属性即可,没有必要继承行车记录仪类
image.png