00:00
我们来看一下接口隔离原则,叫interface segreg。就是这个单词是隔离的意思,隔离。那么首先我们来对。隔离原接口隔离原则做一个基本介绍,它是这样一个定义,客户端不应该依赖它不需要的接口。就说这个接口里面,它不需要依赖的,就最好不要有。即一个类中对另外一个类的依赖应该建立在最小接口上。这句话是不是不太好理解呀?反正这句话,这句话如果说你没有做题,你很难理解什么意思,他的意思就是说我一个类如果要依赖另我一个类,对另一个类的依赖呢,应该。这个这个接口应该是最小的。最小的,你看我这有一个案例,大家听一听就会更理解了,呃,大家先看这样一张图。
01:02
这有个A类,这有一个C类。这有个B类,这有一个D类。这有一个接口,大家有没有发现?这个接口INTERFACE1呢,里边有几个方法,大家看到没有,有五个方法。那么BB这根线代表的是实线。后面我们还会专门讲UML类图,大家不要着急,D实现了接口一,D实现了接口一,那就意味着我们这个B类和这个D类呢,要实现INTERFACE1里面的所有方法,这个能理解吧。那么这个时候呢,他就说了,他说A呢,他是通过INTERFACE1通过这个接口,它会依赖这个B。但是他说了,A中只会使用到接口的123这三个方法,第一及这三个方,这三个方法要用,但是四和五呢,我并不需要用。
02:04
再说一遍,它指这个就说这个A这个类呢,它通过这个接口会依赖B。这也就是说,A它通过这个接口会使用到B。那但是呢,他只是用到这个B里面的123这个方法,四和五我不用。但是你刚才这样子,这样设计这个方案,就意味着B也必须把四和五实现,这个能理解吧,这就没有建立在最小接口上了。C也是一样的道理。他说C通过interface一会依赖这个D,但是呢,它只会用到接口里面的145这三个方法。能理解这意思了吧?因此他说了这个设计他就违反了我们的接口隔离原则。那有时候老师跟你这样讲,我有点不清楚你在说什么,好的,没关系,我现在呢,用代码给大家写一遍,也就是说我现在呢。
03:01
来用代码把刚才这个图展示一下,大家就明白了,也就是说类A通过INTERFACE1依赖于D,类C通过INTERFACE1依赖于D,我们用代码先写一遍,写完了过后我们再来回头说这里面违反了什么原则,再做改进,这样大家是不是就听出听的比较轻松了来吧。我写。一个。我写一个包。大家跟上我的思路,然后在这地方呢,我新建一个。这个包,这个叫接口隔离。这个隔离呢,我们就用这个单词好吧,Sation。Sation。好的,加S。放这儿来。那现在呢?我们来写一个小的案例。好,这边我们写S的第一个案例。这没问题吧?第一个案例走写到这来。然后呢,我们先把刚才这个类图简单的给同学们画一下,第一次看类图好吧。
04:06
我这儿。建一个类图,把这个关系给他捋一捋,这里不是有一个UML吗?看我装了一个插件。这个插件里面可以画我们的类图。我先给他展示一次,好吧,后面还会讲,大家不要着急。那现在呢,我们这有一个接口,OK,这个接口里面有五个方法。我把这个方法加进去,第一个。再加一个。它一共有五个方法,三个。是个。五个OK,好,这就是一个类,那这个类里面呢,他说有个A类。OK,他说有一个B类。他说有个B类,我们看这个B是在哪个位置啊哦,Abcd这样子的,那这边呢有个B类。没问题吧,同学们B类,他说还有一个C类。
05:01
诶,把这个。改一下C类,他说还有一个D类。那么他说了B。B看第一个设计方案B实现接口一那这个时候用哪个线来描述呢?后面这个类图我还要专门讲哈,如果你曾经学过u um类图,这个对应的说没有压力,但是对于没有学过um类图的同学不要着急,后面我会讲,再说一遍,后面我会讲。那么要描述B类和接口之间的一个时间关系,用的是这根线实线线,这样就代表实线。同样,他也实现它。那么A和这个接口A,它通过这个接口去依赖这个B,应该怎么画呢?用这个线dependency。C也是一样的,好,这个类图就画完了,也就是说第一个设计方案其实就这样子的,我把代码马上按照这个类图来完成,来写一个。
06:02
开始。首先呢,我先建一个接口interface。好,写个interface interface1。这里边儿呢,有五个方法,还记得吧,我就写VO。Oper。Operation,这是我们的第一个方法,因为是接口嘛,所以说这边方法就不用实现了。一共有五个。第一个第二个,第三个,第四个,同学们认真听哈,这些都不难,但是呢,一定要认真听,这是接口。这接口他又说了,他在这个类图里面告诉我们B和DB和D它是实现了这个接口的,那这个代码是不是就很很easy了,怎么写呢,Class b。他implements。注意听employment,我们这个接口一。这里边呢,有五个方法,这个能理解哈,我把这个粘贴复制一份就可以了,但并不难。
07:07
好在这里面呢,我把它分别与实现。好,我写一个输出。Public void,我看看这边应该怎么写比较合理。A public void。不可见的是吧。他说,英特保存一下。把这个改一下。对吧,我把这个改一下,改一下过后class b是不是前面我们有一个这样的B了呀。Class b。他要实现这个抽象方法没有写完。Operator。全部先写完吧。把它全部写完。好,那这边呢,我们再写一个,说B中实现了什么呢?OPER1这样子的吧。
08:02
OPERATE1,好的,接着继续往下编写。好的。这边我们加一个public。加一个public就没问题了,因为我不能缩小它的访问的一个范围,同样下边呢,我们继续写。对,下面我们继续写。这边呢,我们打印oper b实现了OPER2。是吧,下面我们继续复制。这边是B。实现了OPERATOR3。好,这边把public也给他,下边这个呢,对实现了。OPERATOR4。实现了operation operation public。对,最后这边呢,实现了我们的第五一个方法。第五,一个方法。5PUBLIC。Public这边也写个public。
09:01
这,这是我们的B这个类实现了接口的五个方法。同样的道理,我们。从这个类图可以看出来,我们这一个D类,它也实现了这五个方法是不是。把它写到这儿,那现在有了B和D过后我们来看。我们来看它的A和C应该怎么写呢?他说了,在我们这个幻灯片里面,他说A类它是要通过INTERFACE1依赖这个B,但是它只会用到。这个里接口里面的第一个方法,第二个方法和第三个方法,所以说A这个类呢,应该这么去写。怎么写啊,首先。他这里面肯定会有一个方法。对不对,他这里面肯定会有方法,什么方法呢?我们来写一个吧,叫做public void,比如说我use,或叫依赖depend depend1。
10:04
我依赖什么呢?通过这个接口interface。对,I,我会用到这里面的第一个方法。Operator。好用到了,那同样道理了,我还会用到哪个方法呢?我还要依赖这个接口用到它的第二一个方法。我还会用到他的第三个方法。也就是说从这个地方我们又体现出A类。通过接口接口INTERFACE1。Interface第一去依赖,或者依赖就是使用的意思,使用什么呢?使用我们这个B类。B类,但是只会用到,但是只会,哎,只会用到第几个方法呢?123这个方法没问题吧,同样的道理,A我们就写完了,那。
11:10
紧接着我们来看它这个类图里面的C,把C也写一下。C类它会,它也是通过我们的INTERFA1去依赖我们的D类,但是他会用到哪个方法呢?在我们这个患者里面说了,他会用到145,对,那既然是145,各位朋友注意听讲,那现在我们这边应该怎么写呢?依赖一。依赖一这个没有没有改动好,他要依赖四,也就通过这个接口依赖四这个方法还要依赖我们的第五一个方法。这就写完了,就是说我这个C这个类呢,通过这个接口会依赖于D。好,同学们,想一想此时此刻。此时此刻,你这个代码这样写,其实就已经满足了这个类图的设计,没有问题吧?但我们思考一下,你这样写有问题没有?
12:05
这样的问题在哪里?我们来分析一下。我们这个写法是严格的按照这个类图的设计来完成的,但是大家有发现,因为你这一个B类。它实现了INTERFACE1里面的。五个方法。而我们的D类呢,也实现了这个啊,那这边应该改成D了。这边也改成D。好的这边。样。你们有发现D类,它也实现了interface里面的五个方法。但是我们有发现A类它通过这个接口去以来这个B呢,其实它只会用到B里面的这三个方法。这四和五其实你白写了。因为我不会用到同样的道理,这个D类里面的哪个方法呢?二和三这两个方法实现是白写了,因为我这个C类通过这个接口依赖D类呢,我只用到145的方法。
13:10
那也就是说,也就是说问题来了,按照隔离原则应该怎么处理呢?因为按照隔离原则,就应该把这个INTERFACE1拆成独立的几个接口。拆成几个独立的接口,类A和类C分别与他们需要的接口建立依赖关系就可以了。再说一遍,就说我们这个类A和类C没有必要去。去依赖这个这个BB和D,因为这个B和D,它它这个它依赖这个,呃,现在BA和C啊,它是依赖这个INTERFACE1的,而这个interface里面一五个方法,并不是我们A和C。A类都要用到的。也就是说你这个接口应该拆。
14:02
怎么拆呢?就是用隔离的原则,要建立在最小接口上这个原则来进行拆解。那这个代码就是OK的。听懂了吗?好了,那这个问题我们已经分析出来了,下面呢,我们对原有的这个类图,就是这个类图我们进行一个改进,并且把代码呢也给大家做一个改进。那具体怎么改,我们看下一个视频。
我来说两句