00:01
组合模式。在JDK源码的分析完了过后,我们再来看一下组合模式使用的一些。注意事项。那么组合模式呢?它能简化客户端的操作,这在前面我们可以看看到哈,客户端只需要面对一致的对象,而不用考虑整体部分或者是叶子结,因为对他来说,他只要搞搞清楚谁包含谁就行了。第二个具有较强的扩展性。我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不需要做任何变化,大家有没有发现,就好像你客户端的组客户端,它只是使用你比如说就拿我们刚才这个类图来说话。这诶不是不是,这是是不是这个,这就这个类图,就这个类图来说话,你比如说这个university包含college college包含这个department,这个是由你们之间的关系来决定的。客户端呢,他并不关心对不对,只要你把这个关系搞清楚了就就OK。
01:04
就OK就完事了,然后呢,方便的创建,创建出复杂的层次结构,客户端不会理会组合中的组成细节,OK,所以说它比较容易,容易创建出比较复杂的塑形,塑形图形。那么所以说在什么情况下咱们用组合模式比较合理呢?就是需要便利组织机构或者处理处理的对象具有塑形结构的,我们推荐使用组合模式,它是比较容易把这个关系搞清楚。呃,但是呢,这个组合模式也有一些需要我们注意的地方,比如说他需要较高的抽象性。第二个呢,如果叶子,如果节点和叶子有很多差异性的话呢,嗯,比如很多方法和属性都不一样,就不太适合这个组合模式了,你看我们前面的这个叶子节点department和这个学院college以及。他的学校university,其实他们大致的方法和属性还是很相似的,比如说你有名字我也有名字,你有描述我也描述,是不是你要打印,我要打印。
02:09
你要得到名字,设置名字我也要,所以说它大致的方法和属性呢,还是相似度比较高的,如果像我们叶子节点和我们这个非叶子节点,它有很多方法和属性不一样,那么就不太适合。这个组合模式了。OK,好,这次我们组合模式的使用细节,那下面呢,我们把组合模式的内容进行一个简单的梳理,我们来看一下组合模式我们是怎么来讲解的,那首先打开我们的笔记,我们梳理一下。我们梳理一下。这个组合模式好。OK。插入一个分页符,现在我们讲的是组合模式。那组合模式我们首先给同学们先提出了一个需求,引起同学们的一个思考,对不对?就是我们提了这样一个需求干什么呢?对学校的院系进行一个展示,如图。
03:08
就是我们希望展示出这样一个效果,那这个时候呢,我们就开始思考了,最简单最直接的方法可能就是我们用继承的关系把他们的,呃,把他们这个做出来,比如说这里我们用的是。学校下面有学院,学院下面有系这样一种结构。是吧,那这样。传统的这种方式给我们带来的问题呢,我们也做了分析,你这种方式的缺点是在哪里?我们来看一下这种方式的缺点,我们先把这标个好啊。这种方式它的缺点呢,是他把这一个学院看成是学校的职类。他把戏看成是学院的之类,那么同学想想,这种父子之之间呢,他是按照组织大小来划分层次的,他并不利于管理,对不对?所以说他不不能很好的实现管理的操作,比如说我们有添加删除便利,那你说这个怎么整呢?
04:12
你是把这个添加删除便利怎么去处理呢?因为它是继承关系,不是很好处理,而我们如果把它变成一种组,变成一个组合的关系呢,诶这就比较好了。就比较灵活了,所以说我们会用组合的方式来替代继承的这种方式,那最终我们做了一个分析,怎么来完成呢?来首先呢,我们对组合模式做了基本的介绍。说了一下什么是组合,组合模式对不对,做了一个基本介绍。来看一下。组合模式,它的核心思想是什么呢?看这里一句话。他是这样子的,表示整体和部分的一种关系。然后呢,组合模式,依据树形结构来组合对象。
05:03
OK。他是这样子来做的,因此呢,这样做完了过后,组合模式使得用户对单个对象和组合对象的访问具有一致性,就是我再去访问你这个学校下面的院,学校下面的学院的时候,以及访问学院下面的系的时候,其实这个相似度很高,就保证他的一种一致性,你看我们都是便利,便利方式都一样,是不是好,这是组合模式的基本介绍完了。把基基本介绍做了功能,我们又用一个类图的方式展示了一下组合模式的一个原理,是不是好,这里我们说到了。组合模式的原理类图。那具体来说呢,就是这画了一个图吧,对吧,这画了一个图,然后我们就对这个图呢做了一些说明。就是对他的角色,它里面包含的角色做了一些说明,主要是这样说明的,主要模式呢,有component。
06:04
有lift。就是叶子节点有composer非叶子节点。那么left和component呢?都是component的这个子类,这样他们之间就可以进行一个完美组合。而且也也可以通过这个。Component来相互关联,就是我component和component之间也是通过这个component,因为他们都是它的指令嘛,进行进行一个聚合,或者是组合好就达到这么一个效果。那这个做完了以后呢,我们又干了一件什么事情呢?解决问题啊,这个我就不截图了,最后我们用这个案例,这个案例来给大家演示了是怎么完成的。好,我们写一下。好了,这个应用案例呢,有这么三点要求。首先呢,我们说了一下需求。对不对,第二个我们画出了一个类类图,这个类图是在1IP画的哪一部分。
07:02
就是这一部分还明白哈,这是我们要解决的一个类图分析代码呢,因为也比较多,所以说老师呢,可能就没有办法再给大家一个一个粘贴了,所以说我把这个代码仍然是有前面的方式,怎么样啊,直接给大家打一个包放这就可以了,同学们要去看呢,把这个Z包拿过来看就行。好,我直接放在我们的笔记中去。同学们养成一个习惯,就是只要看这篇笔记呢,看到一个Z。就意味着是源代码。好了,那我们把这个做完了以后呢,为了加深认识,我们还分析了一下组合模式在我们JDK里面的哈希map这个集合中的一个使用情况。对,就让他感觉到确实哈,这个模式并不是说没有用的,的确在JDK源码里面,我们是用到了哪里呢?就是哈希map怎么用。是吧,所以说在这里面呢,我们也给大家画了一个类图的分析,类图分析和代码类图在哪里呢?其实就是在这简单的画了一下。
08:06
没,没问题吧,OK。我们这边有一个简单的类图,描述了哈行map它的一个组织形式,那源码呢,这块截图我们就简单一点哈,就直接把这幻灯片里面写的这个流程大家看一下就可以了。其实从这里面你们已经看出来,它大致这是个client,这是client,然后呢,这是我们的那个component c,我写到这里了,那这个load呢,就有点像我们L那个LALA的节点,而这个哈希map呢,就有点类似我们那个composite。Composite啊,这个P啊,这边是那个component。Component,好,这个地方洗全吧。Component。对吧,这是composite,对这看到这个composite可能就它了啊,所以说他们是这样一个关系好的同学们,我把这个呢给大家拿到这来。
09:03
这是它的一个图形的说明,这边是代码的一个说明,呃,类图的一个说明,最后呢,我们还给大家说明一下,组合模式在使用时候,什么情况下用比较合理,什么情况下用就不合理,他也是有一个应用场景的,就说任何一个模式它都有一个具体的应用场景,没有哪一个模式是在任何情况下都能通用,没有对吧?所以说我们这做做了一点总结,哪里呢,同学们看。就是说。嗯,在这如果需要便利组织结构,或者处理对象具有塑形结构呢?这个时候我们适合使用组合模式。OK,那如果说你这个叶子节点就是你的叶节点,这个节点和叶子之间有很多差异性的话,那么这个时候呢,不适合使用组合模式。这个概念还是要有的,不然面试官问到你呢,你不能说,诶组合模式我想怎么用就怎么用,他也有一个具体的应用场景,各位那关于组合模式的一个内容的梳理,我们就聊到这里。
我来说两句