程序设计的要遵循的一些理论,也可以理解为程序设计的一种要求和目标,是面向对象程序设计的基石,也是面向对象程序设计的质量保障和依据
单一职责原则
解释:
- 系统中的每个类都应该只有一个职责,而所有类所关注的就是自身之职责的完成,就是一个类只干自己相关职责的活,其它的我不管
- 如果一个类有多个职责,这些职责就耦合在了一起,当一个职责发生变化时,可能会影响其他职责
- 多个职责耦合在一起,会影响服用性(可能只需要服用该类的某一个功能,但是该职责和其他职责耦合在一起,很难分离出来)
- 其实就是我们常说的高内聚低耦合原则,单一职责原则是最简单也非常难实现的原则
好处
将功能分类,模块划分明确,修改一个模块不会造成其他模块的修改,降低模块之间的耦合度
举例:
MVC模式下,无论是Controller层还是service亦或是DAO层,针对每个表都有独立的实现类,不要掺杂在一起,以免因为任何一个操作的变化都引起类的修改
图解:
饭店老板 既当厨师,又当服务员,这不合适
开闭原则
对功能的拓展开放,对修改关闭的原则,因为需求有变化,要求我们设计程序时必须为程序功能的新增留好接口,在新增功能时,不要修改原有代码,而是新增代码,让程序实现对拓展开放,对修改关闭的设计要求
好处:
- 通过扩展已有软件系统,可以提供新的行为,以满足对软件新的需求,提高了软件系统的适应性和灵活性
- 已有的软件模块,特别是重要的抽象层模块不能再修改,提高了软件系统的一定的稳定性和延续性
- 这样的设计同时也满足了可复用性和可维护性
举例:
MVC模式下,每一层都有接口,是和其他层对接的规范,新增功能时,我们可以选择新增Controller层和service层和mapper层代码 不用去修改原有代码
里氏代换原则
凡是父类出现的地方,其子类就可以出现,反过来就不行,子类出现的地方父类未必就能使用
- 子类必须完全实现了父类的方法,具备父类完全的功能
- 子类可以有自己的特征
- 覆盖和实现父类方法时,输入的参数可以被放大,但是不能被缩小,这个有点疑惑
- 覆盖和实现父类方法时,输出的结果可以被缩小,但是不能被放大
- 覆盖和实现父类方法时,产生的异常可以被缩小,但是不能被放大
依赖倒置原则
一个类依赖另一个类作为属性时,应尽量选择抽象类或者是接口,尽量避免直接依赖实现类
电脑里的零件坏了,如硬盘,内存,CPU等,那么直接更换对应的配件,只要插槽一样就能互换,维护比较方便.插槽就是接口,具体的硬件就是实现类。留好接口可以随时换零件,如果插槽只能是适用于某个牌子的零件,那么只能买这个牌子的零件
接口隔离原则
建立单一接口,不要建立庞大臃肿的接口,也就是说要为各个类建立专门的接口,而不要试图去建立一个庞大的接口供所有的依赖它的类去调用
接口隔离原则使用的一些规范
接口尽量小,尽量细致
接口尽量高内聚,尽量和其他接口撇清关系
举例:
演员和角色以及整部戏的关系
图解:
不满足接口隔离原则的情况
满足接口隔离原则的情况
合成/聚合复用原则
当一个类想使用另一个类的功能时,优先使用对象的组合,而不是继承,尽量多使用组合
为什么要是用合成聚合,尽量不要使用继承?
- 继承破坏包装,把超类的实现细节直接暴露给子类,不利于信息的隐匿
- 如果父类发生改变,会引发一系列子类的改变,类之间耦合度高
- 继承是一种静态功能的使用,在运行的过程中不能发生改变,聚合复用可以动态传入子类对象实现功能动态改变
好处:
非常有利于构建可维护,可复用,可扩展和灵活性好的软件系统
举例:
汽车上如果想获得行车记录的功能,单独组合一个行车记录仪对象作为属性即可,没有必要继承行车记录仪类