00:02
迭代器模式。在JDK。这里面的一个源码的使用,那么我们看了一下,在JDK的or list集合里面呢,它用到了迭代器模式,我们来分析一下。首先我们看一下源代码,同学们看一下源代码,这段源代码呢,我们先把它拿过来,好吧,针对这个源代码我们来进行一个分析。在这里我们新建一个。累。因为现在讲的是迭代器,所以叫。我们把这个写进去好吧。这边勾上这个组方。然后呢,我们来看一下这个源码。把相关需要引入的这些包引进去。那我们来看一下这段代码是做了一件什么事情呢?同学们可以看到,在这里我创建了一个list。List里面我加了一个字符串Jack,然后呢,我我用这个a.ter这个方法获取到了一个迭代器,其实这里就是获取到,获取到迭代器没问题吧,那么我拿到一个迭代器过后呢,我用一个while循环啊,这这样稍微的给它格式化一下。
01:17
这这个地方稍微格式化一下。这个Y循环,那么应该少了一个。是吧?是不是少了一个这样的东西,看看这少了一个分号。好,这样就对了。大家可以看到。我拿到这个迭代器以后呢,用迭代器里面的has next方法去判断还有没有,如果有的话呢,我就取出来是这样子吧,好,那么我们运行一下,因为现在呢只有一个jackk,所以说它只输出JK,这是正确的。现在呢,我们来看一下这一段代码里面这个or list,它是怎么使用到我们迭代器模式的。那么我们一边分析一边画出它的类图,好,我把这个类图呢先搁这儿,我们一边分析一边画,好吧,来走一个画出类图,既然你要画这个类图,肯定就要把相关的角色给找到。
02:15
是不是这样的道理?好,我们来看一下吧。首先我们看这个源码里面这个our list。我们追下圆满。我们追下源码,我们发现这个list呢往上走。这个r list,你们有没有发现它其实是实现了一个list的接口,看到没有?那么这个类似的接口,我们再往里面追,我们发现这个类似的接口里边呢,它就有一个叫这个方法。对,这个方法同学们可以看到,其实是在这里,在这个接口里面,它是个抽象方法。对吧,它是一个抽象方法,那也就是说在这个list的接口里面,它有一个返回,或者是要得到怎么样得到这个迭代迭代器对象的一个方法,那如果我们画一个类图的话呢,可以这样去画。
03:13
这边会有一个类似的接口。这个list的接口里面呢,有一个这样的方法,我就直接简单一点把它放放过来好吧。放这儿。那他是怎么做的呢?诶,它这有一个方法返回一个迭代器。我们写的最懒。没问题吧,同学们好。那这个list就相当于是我们的什么呢?同学们看,这个list就充当了聚合接口的作用,也就是说在这个地方这个list。就是我们迭代器模式里面的什么呢?它充当了。注意它充当了什么呀,聚合接口。的作用。OK,那既然他充当了聚合接口,那同学们想一想,我把这个勾下。
04:04
那我们这个list。我们这个r list显然就是它的一个具体的子类,是不是a list。这个类,那这个类里面是不是他会把这个这个方法给实现呢?我们看一下,那我们注一下r list,我们发现。这个rist里面呢,他也把这个这个方法给实现了,我们找一下。在这里我们发现这个家伙呢,他返回了一个迭代器叫I itr it tr,那这个东西到底是什么呢?这个就是我们的迭代器的一个具体的实例,我们追一下哦,明白了,大家看这个。It tr其实就是list里面的一个内部类。对,但是它它实现了E。
05:01
是不是它实现了的这个接口,好,我们现在大大体的思路就明明白了,大家看。我们这个呢,就是我们最先前这个系统提供的方法里面有has next next or remove,好,思路就比较清晰了,来画。那在这边呢,我们有一仍然是有一个接口的。It。好,这里面呢,就有我们原先讲的是里面的最核心的几个方法,是不是一个是ha。Has next。这边返回一个BOO值。是不是同学们bos?然后呢,还有一个什么方法呢?OK,还有一个next方法。NEX文法。好,反按照我们泛型来说,它返回一个具体的类型,还有一个remove方法,这是在我们前面讲的时候说过的。就移除。Remove。
06:01
那同学们可以看到这个接口是系统提供的,那么在我们这个list里面,这一个内部类就是同学们看到的I tr。它实现了这个接口,那换言之,我们可以这样来画这个图。看到。那也就是说这个家伙呢,他实现了。是不是它实现了这个接口。而且呢,大家可以看得到这个inter其实跟他的关系啊,当然这个地方我还我我把这个线把上先画上啊,这是个实线,那这两者之间是什么关系呢。原先我们最早的类图是这一个具体的聚合接口的实现类去使用到或者叫依赖。依赖这个具体的it接口的之类,但现在呢,他因为这个it tr是or release的一个内部类,所以说我们认为它是一个聚合的关系。
07:00
明白。它是一个聚合的关系。好,那同学们可以看到这个思路就已经很清晰了,那我们的客户端client。我们的客户端它是怎么用的呢?客户端它。可以去创建一个他。他依赖这个历史的接口,也当然依赖历史的接口其实是要的or release的,是不是,然后用它就可以去,他在这个地方呢,还会通过our list list里面的ter方法拿到一个接口,当然这个接口其实也是通过这个接口去引来到it tr就在这在我们地方是看得到的,大家可以看到源码里面是可以看到的,对不对,我就不看了。也就是说在client里面呢,我们通过这个list的接口拿到r list的一个对象实例,在通过这个r list里面的这个方法获取了实现了itator这个接口的一个。具体的迭代器,然后就用相关的方法取东西了,是不是这样一个思路?
08:05
好,那这个关系就明确了,那问题来了,有些同学说老师,那我们的具体的数据是怎么放的呢?来看一下同学们找到a list。那么找到a list以后呢?在这里我们发现它有一个对象数组,大家看到没有?Object的对象数组,也就是说它A它是存放的时候呢,它是以数组的方式存放的。明白,那也就是说在这里面,它它其实如果我们画的话呢,就在这个list里面,它是有这样一个属性的,什么属性呢,就是我们的A。Elements,而且呢,可以看得出来它的类型是object数组。明白,那换言之就是我们具体的数据object是放到了。这里面当然你可以说是聚合到里面的,对不对,用这个聚合到里面,这个我们以前画的是不一样的。
09:05
那当然有些东西说这这两者是什么关系呢?原先大家看原先我们这个object也要聚合到这个里面去是吧,原先是不是画的,但是现在不需要了,为什么呢。因为通过我们看这个源码,我们知道it tr它其实是or list里面的一个什么呀。它是这个一个内部类,所以说从这个代码里面呢,你可以来看一下这个代码,来朋友们看,在这里面it tr里面并没有。并没有去,并没有直接聚合我们这一个object的数组,而是直接用了,大家看是不是在这他直接用了,为什么?因为our listing this element element这句话可以看出来,因因为你本身it tr已然是our list的一个内部类了,所以说我直接用用它的这个属性是可以的,因此他们的关系呢,跟原先标准的。
10:03
迭代器模式不一样,它是怎么样呢?它是直接使用。这个了。明白啊,直接使用的当然是通过这个数组来使用的,好,这个关系我们就画到这里,那同学们说了,说老师那a list可以实现这个list的接口,那么有没有别的子类也可以实现了,当然一样的,就跟我们前面讲的一样,计算机学院可以去实现quality接口,那么信息工程学院也可以实现。这个接口对不对,那也就是说这个list下面一定还会有其他的具体的指令,我们来看一下是不是这样子的,来lawyer。那list的结构还有什么呢?我们找一个大家熟悉的哈,比如说大家应该熟悉,像linked list应该熟悉,还有a linked list还有victor都在下面都有,如果有兴趣的同学们可以追一下。Victor应该也在这里面。OK啊,看到没有,所以说如果我们画的话呢,诶同学们可以再画一个啊。
11:03
比如说我们这个林可的。In的list。其实呢,他也实现了这个接口。它里面也可以拿到。通过这个也可以,你这样实现这个结果里面也有的方法,对不对,他也可以去取得一个迭代器,至于他取的是哪个迭代器,咱们也可以去稍微的搂一点,好,如果带大家看的话呢,我们看一下这个源码吧。诶,我我找一下这个源代码。对不对,咱们不着急啊,看一下应该也有类似的这样一个东西,零宁可的。Link可的list对不对?Link我们追一下它的源码。好的,我们发现它也实现历史的接口,那看看这里面它有没有特这个方法呢?诶我们发现啊,我们发现往下走。看一下他有没有哈。他有没有这个方法呢?往下看。
12:01
往下看。啊,这个不。不去管它啊,不去管它往下走。这个方法。诶,这里面为什么没有找到呢?他实现这个接口了,那如果他没实现,那可能是他的他继承的这个来来实现,他直接直接用了,这也是有可能的,对吧,我在这搜一下,看看能不能直接收到,因为他如果没实现,那就是它的子类了,他他的负类来实现。想看一下。我来看看啊。没有是吧,没有。那他这儿没有的话呢,我们可以看看它的这个。那不不能够啊,不能够我们在。看一下往上走。这个方法。
13:03
好没有,那我们就看它的这个类。啊,看看它这个负类找,往这里面去找。好,这里面,诶果然是在这里,大家看到没有。他这地方是按这个list它返回的,这他反的是个list。诶,但是呢,不管怎么样,他虽然他他自己没有实现,但是他的负类,他有一个抽象的类,在这个负类里面实现了也是一样的。总而言之,你一定会有一个方式,就是根据刚才我们画的,他一定会有一个方式去拿到这个一个接口,呃,拿到一个这个对象就可以了。至于是他自己实现的,还是它的副类去给你返回的,这个无所谓啊,这个无所谓好,那同样它这里面呢,也可以放东西了,肯定也是放到object了。但是他的具体的存在形式是不是就不是对象了,而可能是个链表?对吧,那链表,那按照链表呢,我仍然是可以用迭代器来进行这个遍历的,那我们再来看特这个接口会不会也有其他的具体的子类呢?我们再来看一下来找一个。
14:13
呃,我们看看啊,这有一个这样的东西,肯定还有别的。我们老。找到。我从这追一下。这边找到我们的。这一个ter,那ter这个接口哈。这个结构从这边找吧。这边不是有个这个吗,我直接从这追。好,追到这个接口了,然后呢,我们看看它下面有没有其他的具体的实现之类,好我们发现呢,还会有还是有其他的来看,还有很多看到没有。看这个it tr就是它的一个具体的时限之类,对不对,那还有其他的,比如说我找一个。诶,看很多很多啊。比如像这个entry。
15:00
是不是还有像这个imun,我们,诶像这个也是看到没有。这个也是看。是不是它是这个哈希table里面的,看到没有,哈希table也是个集合嘛,所以说这个呢,也是在哈西里面成为一个什么样类不累,所以说如果我们要画个图的话呢,也可以这样去画。在这儿画一个这样的。对不对,他呢也去干什么呀,实现了这个eerator这个接口,那当然如果你是哈table来取的话,就取的就是imun immator这个迭代器了。这跟我们前面讲的是一样的,好了,同学们这个大体的这个思路就说到这,我们把这个代码呢,简单的再给大家做几点说明,好,我们来整理一下这个角色的分析,我们来看一下根据前面这个类图。根据刚才老师画的那图,我们来整理一下他们分别充当什么样的角色。第一个,同学们感到累不累?这个内部类同学们看到it tr它充当的是什么呢?它充当的是具体实现什么呀?实现迭代器,迭代器itter。
16:12
Rate。的一个类。是不是它充当是具体的实现这个类,那么它是作为什么呢?它是作为对R。List的一个内部类存在的。这是第一点,我们要知道第二点,我们可以看到list是什么呢?就是它充当了什么呀,充当了一个聚合的接口。这里面有一个具体方法干什么呢?含有。还有一个叫做terter的这个方法。这个方法会返回一个什么呢?返回一个迭代器对象。OK,说它是充当那个聚合接口,还有同学们看到的r list,这个是什么呢?它是它是什么呀,它是一个具体的具,它是什么样,这样说他是一。
17:08
这个类是。它实现了聚合接口list。的一个一个一个子类。对不对,一个子类,而且呢,它实现了什么呀?Ter这个方法,它实现了ter这个方法。OK,能够得到一个迭代器,还有一个同学们可以看到从这边分析出来呢,我们这个eer。这个。这个接口。这个接口就是系统提供的。是吧,系统提供的。那么我们再来看下面还有一个就是呃,我们刚才分析到的哪一点呢?迭代器模式。对迭代器模式,我们可以看到这个迭代器,迭代器这个模式在干什么呢?解决了。
18:01
他解决了一个什么呢?不同的这个集合。不同集合。不同的几,比如说你可能是a list,也可能是link的list,从我们这是不是我们还画了一个link list呀。就是我不管你是一个什么样集合,然后呢,我们可以解决一个统一便利的问题。便利问题。好,同学们,那关于这一点我们就说到这,根据这个图呢,大家应该是一目而了然了,其实这个跟我们前面讲的迭代性模式几乎可以吻合,是吧?这个如果说我们比较的话,这个inter是系统,不管它it tr和imm,这个呢就有点类似于我们前面写的。Computer的,那呃,计算机学院的迭代器和信息工程学院的迭代器,而这边呢,一个是可以看成是一个是计算机学院,一个是信息工程学院,而object呢,就有点类似于前面我们写的那个department。
19:00
是不是都能够有个对应的关系啊,好,同学们,那关于它的源码的分析,我觉得说到这里就可以了,大应该是可以理解对不对,很经典的很经典的一个迭代器模式叫人用了,而且rist可以用的,Linkol list也用了,像哈希table也其实用到了迭代器模式。好,关于迭代性模式源码分析,我们就聊到这里。
我来说两句