00:01
组合模式在JDK集合的源码分析,我们仍然来找一找,在JDK里面哪里它使用到了组合模式呢?找了一下我们发现呢。就是在。查找的过程中,我我们发现Java的集合类还是map。他就使用到了组合模式。它是怎么使用的呢?来,同学们,我们先给大家追,把源码再做一段整理,好吧,呃,我们先把这段源码拿过来用,因为代码本身它不难,主要是看源码。呃,它的一个,呃,怎么就跟我们的组合模式关联起来的,那代码我就写到这里。写一个类,这是讲的comp。Comp composite主方法勾上,好,各位同学可以看到,现在呢,我这里有一段代码把它全屏一把,诶这个地方。现在是不全屏哈,好引进去了,同学们看我这里做了一件什么事情呢?首先。
01:04
我在这里创建了一个哈希map。对不对,是个集合,这个哈希map里面的K是integer。它的值是string。然后呢,这边是用一个map接口来接收的,然后这个地方我就直接通过哈希map往里面放了。一个建筑段,大家去看一下,这种方式就相当于说直接放的是叶子节点,这个叶子节点在我们源码里面呢,它是以这个node。展示出来的,另外还有一种是还有一种添加方法呢,是葡萄,葡萄是怎么做的呢?他说你可以先创建一个哈西map。哈希map创建完了过后,把这个。把就是把你的这个map。把你这个哈希迈普。加入到这个哈希麦里面去。但用的方法是葡萄。不招好,那同学们可能看到这段代码说,诶老师我也我我我也没看出来他这里哪里用到了组合模式呀,不着急啊,我们一点点分析,大家就一目了然了。首先我们来看这个接口。
02:07
各位朋友,打开这个map,这个map你们有没有发现是个,呃,这个interface同学们还记不记得我在前面讲过。我在前面讲过,就是说我们这这个最顶级的这个component。就这个component。Component,它可以是一个抽象类,也可以是个接口。这个map他在这个地方啊,就有点类似于充当了我们component的一个角色,那为什么这么说呢?你们有没有发现这个接口里面有很多方法,看这里。Put。你看这是不是这是一个put方法。这是接口,它就没有实现了。再看普。是不是诶。有有点感觉没有,那么这个map这个map接口下面它的子类有哪个呢?我们来看一下各位朋友,我加一个CTRL加T。
03:03
那这个时候你会发现,诶,它下面的子类其实蛮多的,OK啊,就是实现这个接口的类蛮多的,其中呢,有一个abstract map。看到没有obstract map,这个OB obstract map呢,它实现了我们这个map接口。对,那同学们可以看到这里面是不是它就有put方法了呀,看put方法。是不是这个普通方法,你有没有发现他跟我们很类似,他也是做了一个默认实现,扔出了一个不支持他操作一个方法,那说明这个方法呢,还得由他的下面的子类继续实现,因为upstra在这它是个抽象类。所以说这这就相当于说他又多做了一层,他用一个接口做了,然后用一个抽象类去实现这个接口。对吧,所以说这个up map呢,也在在我们组合模式里面,其实它的地位也相当于component,只是他这个component呢,跟我们那个component不一样,它是做了两层。
04:03
做了两层,好,那我们现在看abstract map下面有没有指令呢?再来看,这时我们就看到熟悉的哈希map了,往下走。大家有没有看到哈希map在这,诶同学们看这个哈希map是不是继承了abstract map,同时呢,他也把这个接口也去实现了。那同学们看这个是不是就有点类似于,如果针对我们前面画这个图,它是不是有点类似于我们的这些东西了。是不是哈希map有点类似于我们具体的实现的实现这个component的子类了?好,那这个哈希map相当于谁呢?它就相当于我们这个。这个college或者university。看到没有,为什么说,因为你看这里他把这个put方法。同学们看这里面的put方法。它就。给我们写好了,那put方法里面调用put value,这个put value肯定是写完了的,看内容很多。
05:03
啊,Put on呢,一样的put on,看put on,这个put on里面呢,它就是put map这个方法往里面追看,又是一堆代码,所以说如果从这个类,从这个类图来说呢,我们可以看到这个大致的结构是首先。这个哈希map,它继承的这个obtra map是一个抽象类。他有实现这个接口,所以说我们可以认为这个就是一个具体的,呃,具体的一个comp composite,而abstract map和这个map呢,我们认为是component是抽象的这一层。那问题来了,说老师那不对,你现在已经分析出来有component了。Component的有了,诶你说这个component下面呢,还有就是你刚才所就是刚才我们所说的哈,Map。对吧,你假如说这样子,就是中间我们多了一层,那么问题来了,叶子节点在哪呢?就是这个left在哪呢?好,同学们可以看到叶子节点其实在这是有的,它在这里面呢,有一个什么,同学们看啊。
06:10
这个node。这个node是哈希map的一个静态,累不累,大家有没有发现在哈希map里边呢?也要认真观察,发现有个node,诶,有没有发现这个node呀,它就是。一个静态。的内部类load,那这个load其实就有点类似于我们前面讲的叶子节点,因为为什么呢?它下面你们有没有发现这个load里面就不再有put at方法了,它主要是get set方法居多了,也就说这里面就是相当于是是一个叶子界面。就是我们这个存放值的,就是用漏来存放的,如果同学们认真去追的话呢,你会发现他就是这样追的,来我们追一下。跟着我的思路啊,Put里面有个put。PUT2里面有没有看到他得到一个K。
07:02
他有K和value,然后把这个k value来了过后他做了一个load,然后把这个load放到了我们这一个哈map里面去,就这样一个流程是不是,诶大家看看是不是,是不是大致可以理解这个这个关系了呀,如果我们画一个类图来说的话呢,它大致是这样一个关系。呃,我还在这简单画一画啊。呃,简单画一下,保存一下。大致是这样一个关系。呃,首先呢,这有一个接口。Map。OK啊,然后呢,有个类。Abstract。什么呀,哈西。Map。对吧,然后就是我们的哈希map对不对,哈希map他们之间的关系呢,大体是这样的一个关系,就是他去。呃,他去实现了map,而哈希map呢,又去继承了abstract map。
08:00
对吧,而而呢,在我们这一个哈希map里,哈希map里面它有另外一个类。就是静态类不类no。对,这个node呢,是哈希map里面的一个,呃,一一个一个静态类,所以说相当于聚合到这里面,这个有点类似于就是我们那个什么呀,就是那个department。啊,就是它的一个叶子节点,然后我们这个客户端怎么去用的呢?OK啊,那么这个客户端其实它就是通过这个map接口。是吧,我们这有map接口,再结合这个。用起来,其实你看这个跟这个很像,而而呢,在我们这个map,这个map里面它有,它就写了很多这个管理我们管理我们这个。这个内内容的一些方法,比如说像put。对不对,还有什么呀,葡萄是不是还有葡萄,诶,我这写一下啊,还有葡萄。是不是有葡萄啊,同学们,有葡萄。Put。那PUT2对新方法是不是就一层层的往下来了?而同学们注意看到这个load,因为它是叶子节点,如果你认真观察的话呢,这个load里面并没有像put put out的方法,注意观察。
09:09
所以你看画一个图大家就一目了然了啊,同学们,我这个上哪去了?Node在啊,这这只能看这个图了,看这个node里边。我在这儿追一下。你看这个漏。Z的,因为它相当于我们的叶子节点,你看这里面呢,有get get,但是你们发现没有再往里面加东西了,因为它它已经是叶子节点,它就相当于是他是最。呃,最基础的,最最下面的那个,呃,存放我们数据的一种结构了,是不是,诶就这么一个关系,就这么一个关系,OK,同学们,那现在这个图大致也就能看懂了,你看我们这个分析的是这是源码,然后让大家看了一下我们这个map。这个map里面有爱的云步方法,这个相当于component。然后这个这里面有一个node node相当于我们left。
10:00
OK啊,那哈希map呢,它继承了objecttract同时实现的这个,所以说相当于是他下面的一个具体的实现之类,就这么关系,OK。明明大致明白了吧,同学们好,现在呢,我把呃,我把刚才这个说明呢,再给大家整理一下,可能有些同学还是有点模模糊糊的,我再整理一下这个思路。那么我们对对这个代码呢,做一点说明。大家再做一点说明,大家一下就明白了,一,首先我们看到map啊,Map就是它是就是一个抽象的,就是一个抽象的什么呀,构建。是个接口,肯定很抽象了,有点类似哈,就说相当于类似类类似类似我们的这个component。Component component没问题吧,好的,这是第一个,第二个,第二个我们分析出来哈希map。哈希,Map。哈希迈普,那哈希迈普在这边算什么呢?它是它相当于是一个中间的。
11:07
中间的一个什么呀,一个构建。呃,等价于什么呢?等价于我们前面讲的composite comp composite composite这个东西是不是是不是这里面,而且它这里面有什么呢?它就是这个里面实现了,它这里面实现。实现了一系列的方法,实现了相关的方法,我写写相关方法,哪些方法呢?同学们可以看到最用的最多的就是我在这写的时候有put方法。是不是有这个put方法,还有这个put这个方法put方法,但是我说啊,这个方法不管是他自己实现的,也有可能是继承下来的。为什么说有可能是继承的,因为这个哈希迈普他还继承了那个抽象的。抽象的那个up还是map,所以它有可能是实现,有可能是继成这个呢,大体这个这个含义,它是它是有的,对不对,好这样一些方法,那么我们再来看这第三点。
12:06
第三点,第三点呢,我们要说的是。什么呀,就是一个node。这个node它是什么呢?是哈希迈普的一个静态,累不累?静态内部类就是类似什么呢?类似就是我们的这个业绩节点那。是不是类似于一个叶子节点,就是我们说的叶子节点。叶子节点。是吧,所以说你们要认真观察的话,这里面就这里就没有没有像这个put的方法呀,Put这些方法就没有,当然也没有remove这些方法都没有啊,都没有,那具体来说这一个东西长的样子就他。是不是OK?好,放这就可以了。放这就可以这样子一分析呢,相信同学们应该理解的就更清楚了,对不对,这个因为它是一个液体点,他就只有get,主要是get和set的一些方法,他就不再有没有put put out,而我们的哈希map这是是有的。
13:03
包括哈希map的这个抽象,它的上一级的一个抽象类abstract,哈希map也有对吧?好了同学们,那关于我们这一个,嗯什么呢?就是关于我们这一个就是组合模式的源码的分析,我们就聊到这里。
我来说两句