00:00
下一个原则。依赖倒转原则。那依赖倒转原则它的一个基本概念是什么呢?我们来了解一下,依赖倒转原则呢?是dependency inversion principle。他这个原则呢,有五个点需要同学们掌握,第一个它规定高层模块不应该依赖低层模块。就说高高层模块不要依赖于低层的,不要反过来去。进这个依赖OK,那么二者都应该依赖于抽象,那何为抽象呢?比如说抽象类或者是接口,我们就可以称之为抽象。换言之,就是说我们可以去依赖接口,我们也可以去依赖抽象类,但是不要去依赖一个具体的子类。下面又接着说抽象,不要去依赖细节。细节应该依赖抽象。
01:03
那也就是在这里阐述一遍倚赖倒转原则,或者叫做倒置原则,有些书上呢,他把这个倚赖倒转翻译成倚赖倒置一样的,就把这个inversion。他把它翻译成。这个倒置也是可以的。意思都一样,他的核心思想就是说。我们要尽量的面向接口编程理解。那么依赖倒转这个原则,它是基于怎样的一种理念来设计的呢?他认为或者说我们程序员在开发的过程中,我们发现有这样一种规律,什么规律呢?相对于细节的多变性。我们抽象的东西要相对稳定。也就是说,我们越是高层的。相对来讲呢,我们要稳定一些。以抽象为基础搭建起来的架构比以细节为基础的架构要稳定的多。
02:01
因此呢,在Java中抽象它主要指的是接口和抽象类,这就是为什么我们在后面学设计模式的时候,往往它最它的高层模块呢,都是接口或者是。我们的抽象类,而细节你可以理解成就是具体的实现。实现类。OK,那么使用接口或者是抽象类的目的。它主要是在于制定好规范,这就是我们经常所说的接口和抽象类的价值在什么地方呢?在于设计。同学们有没有?在学面向对象的时候,老师讲过,讲接口的时候,讲抽象类的时候,往往一般来讲,老师都会提到一点,我们接口和抽象类的价值,它是在于设计。我们在讲设计模式的时候,你就会充分的体会到接口和抽象类,它在设计模式里面起到的重要作用。
03:00
而我们这个接口和出现的呢,往往不会涉及到具体的操作。把展现细节的任务交给谁呢?交给他的时限内去完成,也就是交给他的子类去完成。明白好,这就是我们依赖倒转原则的五个点,那这样讲,我相信大部分同学也很难理解,因为这个东西它本身比较抽象,然后再用语言描述一遍呢,你仍然不知道老师在说们说什么,下面呢,我们再举一个实际的案例。我们举一个依赖倒转的史记案例,我们来看看不用依赖倒转。会出现什么问题?使用了依赖倒转原则,又会让我们程序有什么好的地方?好吧,我们还是老规矩,先用。实现方案一,这个方案一呢,肯定是传统的方法。方案二呢,对它进行优化,就是使用我们以来倒转原则进行一个改进,这样呢大家就会对以来倒转原则理解的更加到位,说现在有一个person类。
04:04
这个类里面呢,它有一个发送消息,我们干脆叫接收消息吧,好吧,我们叫接收,不叫发送叫接收。他要接收消息,有这么一个功能,希望你去完成。那你想你会怎么设计呢?好,我们来写一下这个代码,打开我们这个位置,我们新建。一个包包。这个叫做依赖告知我们就叫inversion吧,好吧,Inversion。那首先我们先写啊,第一个。方法叫依赖第一。Dependency。In OK。把主方法勾上。然后呢,在这里呢,我们先写一个类,我们现在要去完成一个person干什么呀,接收。接收接收。
05:04
接收消息的一个功能,好吧,那按照我们传统的方式一来完成。那么待会儿呢,我们会分析方程,呃,方式一,有什么问题,先写一个类class person。这个person他既然要去接收消息,当然我就可以用个receive。Re,是吧?Receive,我要接收什么消息呢?假如我写接收是电子邮件,好吧,我们要接收电子邮件,我们就写了一个email,当然待会儿呢,我会写个email这个类。先写到这儿吧。这样它编译才能通过,那么这个电子,这是个电子邮件,电邮类。我我就不写注释了,因为很简单对不对,那现在这个里面呢,有一个方法。Public返回一个村,我写个叫做get for。
06:01
Get in for,那我返回一个字符串吧,好吧,Re,什么呢,电子?电子邮件。电子邮件信息。电子邮件信息,我写一个叫做hello。Hello,好吧,Word。Hollywood返回。那这个电子邮件内呢,它提供了一个方法叫get for,我在接收电子邮件的话呢,我就直接调用他的方法就可以了,我把信息给他打出来email。点get in for。好,我们来测试一把。但这个测试肯定是非常的简单,对不对,我六一个person。我一个person。好,Person对象我们有了,然后呢,我调用person这个对象的什么方法呢?Receive方法。
07:01
我又一个email。这样呢,我这个email拿到过后,我用email这个对象的get for就可以把电子邮件信息拿到,Hello word我们运行一把。来,各位同学,我们运行过程中发现没有任何问题,我们得到的电子邮件信息hellowood,待会就写完了。周老师,你写字带吗?好像有点问题啊,有什么问题大家发现没有?大家有没有发现,大家有没有发现我在接收消息的时候,我在这里居然直接写了一个类。我在这里面写的类,我就直接依赖这一个email,那问题来了,我们方式一的问题在什么呢?我们来对方式一进行一个分析,我们看第一个问题。这个首先我们所说的好处,好处肯定就是这种方式是比较简单的,比较容易实现,或者容易想到,比较容易想到这个方案是不是,但是他的问题也非常明显,看。
08:05
如果我们获取的对象是微信,比如我们现在不是电子邮件,是从微信获取消息,或者是短信等。等等,那么则你这个方案。会怎么改?同学们,假设我们还要接受。微信的信息,还要接受短信,手机短信的信息,这你会怎么样,你要增加新增。新增什么呀类。要新增类。同时我们person大家看person这个类呢,也要也要增加相应的接收方法。是不是要接受相应的方法,因为你这个receive它是直接跟email进行一个关联的。那你加了一个微信这样一个类,那你显然这个receive方法你要重写。
09:02
哪怕你是重载一下,也要重新写,对不对?好,这个问题就比较严重了,那怎么办呢?我们来解决一下,我的解决思路是这样子的,同学们想啊,我们引入先说我的思路,引入一个抽象的。抽。抽象的接口。呃,接口这个接口呢,比如说我取个名字叫做I receiver。Re receiver这个接口表示什么呢?表示接收者。接收者。哦,我表示一个接收者,这个时候这样呢,我们person person类与谁呢?哦,与这个接口。大家看与这个接口发生依赖。啊,就是发生。发生这个依赖。也就是说我待会这个接收的时候,我不再是以这个类来接收,而是按这个接口,这个接口就是我们所说的IC I receiver这个接口发生一个依赖。
10:11
那发生这个依赖过后有什么好处?我们来说一下。这时。因为因为这个email。Email,还有我们的微信。微信等。等等,他们都属于什么呀,属于接收的接收者的范围,对吧,是吧,属于接收。的这个范畴。或叫范围吧,那他们各自他们各自实现,实现什么呢?I receive这个接口就可以了。就可以就OK,这样也就符合了什么呢,这样。这样就我们就符合符合什么呀,就是我们说的依赖倒倒转原则。
11:00
倒转倒置原则或者倒转原则都可以,那大家看到,因为我们刚才讲过依赖倒转原则的核心思想,它是要体现接口编程。也就是说我们要依赖这个,依赖这种抽象的东西,而不要去就说我们细节要依赖抽象,不是让抽象依赖细节。那这样我们才会有一个缓冲层。那设计的才会更加的有有伸缩性,或者叫有弹性,你看你这样写个email,直接这样预做,而我们这种写法,很多同学经常这么去写的。是不是你因为你你就让email,那现在有微信,你你这个就用不了了,好同学们,那关于我们的第一个方案的实现,还有第一个方案的不好的地方,我们已经分析出来了,下面呢,我们准备用什么呀?下面我们就准备用这个方案二,也就是说用依赖倒转原则对方案一进行一个优化。那具体优化的这个方法呢?我们在下一个视频为大家讲解。
12:02
这件先先到这里。
我来说两句