面向对象设计原则

常用的面向对象设计原则包括7个,分别是单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、合成复用原则和迪米特原则。

面向对象设计的目标之一在于支持可维持性复用,一方面需要实现设计方案或者源代码的复用,另一方面要确保系统能够易于扩展和修改,具有较好的灵活性。

一.单一职责原则


Single Responsibility Principle,SRP

一个类只负责一个功能领域中的相应职责。或者说,一个类,应该只有一个引起它变化的原因。

二.开闭原则


Open-Closed Principle,OCP

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

在定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。

为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。

三.里氏代换原则


Liskov Substitution Principle,LSP

所有引用基类(父类)的地方必须能透明的使用其子类的对象。

里氏代换原则表明,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。

里氏代换原则是实现开闭原则的重要方式之一,在运用里氏代换原则时,应该将父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,可以很方便的扩展系统的功能,无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。

四.依赖倒转原则


Dependency Inversion Principle,DIP

如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现。

抽象不应该依赖于细节,细节应当依赖于抽象。换句话说,要针对接口编程,而不是针对实现编程。

依赖倒转原则要求在程序代码中传递传递参数时或者关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要使用具体类来做这些事情。

在实现依赖倒转原则时,需要针对抽象层编程,而将具体类的对象通过依赖注入的方式注入到其他对象中。依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。

常用的注入方式有三种:

  • 构造注入:通过构造函数来传入具体类的对象。
  • 设置注入:通过setter方法来传入具体类的对象。
  • 接口注入:通过实现在接口中声明的业务方法来传入具体类的对象。

五.接口隔离原则


Interface Segregation Principle,ISP

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

这里的接口有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;另一种是指某种语言具体的接口定义,有严格的定义和结构,比如Java语言中的interface。

六.合成复用原则


Composite Reuse Principle,CRP

尽量使用对象组合,而不是继承来达到复用的目的。

七.迪米特法则


Law of Demeter,LOD

一个软件实体应当尽可能少地与其他实体发生相互作用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏项勇

笔记45 | 代码性能优化建议[转]

14860
来自专栏逍遥剑客的游戏开发

Nebula3学习笔记(3): 核心库

205110
来自专栏海天一树

小朋友学C++(6):this指针

this指针是一个隐含于类中的特殊指针,指向对象本身。也就是说对象一旦被创建,this指针也就存在了。 就好比你的名字叫做Teodoro,别人说你的时候用的是T...

29260
来自专栏大史住在大前端

野生前端的数据结构基础练习(2)——队列

循环队列书中并没有提及,它是一种特殊的队列。简单理解就是将基本队列只当做存储结构,而使用front和rear两个指针分别代表队列的头和尾,实际对外表现的队列是f...

22430
来自专栏Java技术栈

Java 面试题经典 77 问(含答案)!

19930
来自专栏抠抠空间

ECMAScript简介以及es6新增语法

10000
来自专栏余林丰

Effective Java通俗理解(下)

第31条:用实例域代替序数   枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用...

29290
来自专栏java达人

Java中的堆和栈的区别

当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更...

25560
来自专栏difcareer的技术笔记

JNI实现源码分析【四 函数调用】正文0x01:dvmCallMethodV0x02:nativeFunc0x03: 何时赋值

有了前面的铺垫,终于可以说说虚拟机是如何调用JNI方法的了。JNI方法,对应Java中的native方法,所以我们跟踪对Native方法的处理即可。

11540
来自专栏恰童鞋骚年

【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱

  一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力。因为是...

8120

扫码关注云+社区

领取腾讯云代金券