融会贯通——深入了解面向对象设计原则“依赖倒转原则”

一千个人眼里有一千个哈姆雷特,下面我尝试用深入浅出的语言贯穿到“控制反转”,“依赖注入”,“面向抽象编程”,以及“面向接口编程”这几个概念。

传递参数,关联(组合&聚合)关系时,要尽量引用高层次的抽象类,使用基类和接口进行变量类型的声明,参数类型的声明,数据类型转换(也是向高层次的抽象类转),而不要用具体的子类。

以上总结为“控制反转”,也叫“面向抽象编程”。

真到了要使用具体子类的时候,采用“依赖注入”的方式:

  • 构造注入,通过构造函数传入具体类的对象
  • setter注入,通过setter方法传入具体类的对象
  • 接口注入,通过在接口中声明的业务方法,来传入具体类的对象作为方法的参数

  ——> 引申到“面向接口编程”的概念,接口的意思就是“如果你是***的话,你能干嘛?”,接口中定义的是能干嘛,具体怎么干不告诉你,等你是了(即实现该接口)自己去想具体怎么干。

接口是抽象概念的一种,当你在面向抽象编程时,传递参数,关联关系,使用的是接口来声明变量类型,参数类型以及数据类型转换,而不是具体的类,这就是面向接口编程。

所以,总结出这些概念的关系是,面向对象编程的中心思想是面向抽象编程,而面向接口编程是面向抽象编程的一种。

那么问题又来了,如果面向接口编程只是面向抽象的一种,那么另一种是什么呢?

另一种就是抽象基类,要注意区分这里的基类的概念,它包含abstract关键字的class,也包含普通父类(普通父类也是其众多子类的抽象化身),这里主要多说一下abstract class,它很容易与接口混淆,那么abstract class与接口的区别是什么?

  • abstract class可以包含有方法体的非抽象方法,可以包含任意作用域的成员数据。而接口一般不使用成员数据(即使有也是自动转为public static final类型),接口的所有方法都是没有方法体的抽象方法(接口内部不用abstract关键字)。
  • abstract class是对属性,行为的抽象,同时也可以有自己的具体方法。而接口只是对行为的抽象,接口更像是abstract class的特殊情况。
  • 这两种不同的抽象概念更好的支持了Java多态(一个基类可以有很多子类is-a,一个类可以实现很多接口like-a)。abstract class仍然是个类,必须是相同种族抽象出来的类,例如动物类,熊猫类,而接口只是对行为的抽象,不管谁实现他,也不管他们是否是一个种族,例如动物和汽车都可以跑,那他们都可以实现具有“跑”行为的接口,对于接口本身来讲,他并不关心你是动物还是汽车,他只管定义他的“跑”就行了。

依赖倒转原则,总结一句话就是定义时用抽象类型(基类或者接口),运行时注入具体类型。

开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏诸葛青云的专栏

一步一步教你从零开始写C语言链表——构建一个链表

今天小编给大家带来c语言难点--链表的讲解,一步一步教你从零开始写C语言链表---构建一个链表。

14700
来自专栏lulianqi

UNICODE与ASCII

     ASCII 是用来表示英文字符的一种编码规范。每个ASCII字符占用1 个字节,因此,ASCII 编码可以表示的最大字符数是255(00H—FFH)。...

33330
来自专栏java一日一条

Java中有关Null的9件事

对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认这是他的一项巨大失误。Java为 什么要保留nu...

10020
来自专栏Java学习网

Java中有关Null的9问题

Java中有关Null的9问题 对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认...

23450
来自专栏工科狗和生物喵

【计算机本科补全计划】C++ Primer:指针和const限定符

正文之前 今天下午看了一下午的计算机组成与设计,结果好死不死的看到了设计部分--处理器的设计。天哪,我现在还只是一个准备给人装一台电脑做实验田的家伙,连用都不咋...

28440
来自专栏用户画像

7.5.2 基数排序

基数排序是一种很特别的排序方法,它不是基于比较进行排序的,而是采用多关键字排序思想,借助“分配”和“收集”两种操作对单逻辑关键字进行排序。基数排序又分为最高位优...

8630
来自专栏逸鹏说道

我为NET狂面试题-基础篇-答案

面向过程: 答案:图片只贴核心代码,完整代码请打开解决项目查看 (答案不唯一,官方答案只供参考,若有错误欢迎提出~) 99乘法表 https://githu...

369130
来自专栏Java帮帮-微信公众号-技术文章全总结

第九天 面向对象-类,封装,对象,private,this【悟空教程】

24760
来自专栏C语言及其他语言

C语言的数据类型

变量与常量数据 在程序的世界中,可以让计算机按照指令做很多事情,如进行数值计算、图像显示、语音对话、视频播放、天文计算、发送邮件、游戏绘图以及任何我们可以想...

53850
来自专栏带你撸出一手好代码

Java元组的使用

元组在计算机领域有着特殊的意义,这个名字听起来似乎有些陌生, 平时在写代码也基本没什么应用场景, 然而, 出人意料的是, 元组跟程序设计密切相关, 可能有的同学...

52380

扫码关注云+社区

领取腾讯云代金券