00:00
Java设计模式之组合模式。先看一个需求。那现在呢,有一个这样的需求,大家思考一下。你会怎么去实现说有一个学校院系的展示在一个页面上,比如说我们需要在一个页面上把学校的院系它的一个组成的形式。展示出来,你比如说清华大学这个是学校,学校下面呢设有计算机学院。设有信息工程学院,当然还有别的学院,我就没有写那么多了,在这个学院下面呢,有他的专业,比如说有计算机科学与技术,软件工程,网络工程等等,那大家可以看到。嗯,现在如果我们要在一个页面里面把一个学校的学院以及他的专业展示出来,你会怎么去做呢?OK啊,那现在想我们仍然是先提出一个方案。如果我们用传统的方案来解决,一般的人呢?会这样想,就说我们先写一个学校。
01:04
学校下面呢,有学院是不是。学院下面呢有戏,然后呢,我们把它做成一个继承的关系就完事了,但实际上这样做呢,他是有问题的,大家想一想,学校和学院之间真的是一个基层关系吗?其实更。更容易的,更合适的一种关系应该是学校包含学院,而学院包含系是这样子的,关是这样的,也就是说他们准确的关系应该是一种。组合的关系。是吗?所以说这个时候这个传统方案带来的问题呢,它是比较严重的,那我们来看一下怎么解决。传统方案呢,他在这个展示刚才的那种继承的方式来解决的话,存在问题是他将学院。是看成是学校的职类,将系或者叫专业看成学院子。这样实际上是站在组织大小的。来进行分成的,就是说。
02:00
一个大的组织结构包含或者叫一,一叫小的组织结构继承大的组织结构。实际上我们要求的是什么呢?大家看,我们实际的要求是在一个页面中展示出学校的学院组组成。是一种组成,对不对?那一个学校里面有多个学院,一个学院里面有多个系,因此这种方案呢,不能很好的实现管理的操作,也就是说你这种继承关系很难把这个管理的概念包含进去。因为你是让学院继承学学校,如果我们让一个职业去管理他的一个父类,这个就显得不合适了。啊OK,那比如说我们在这个学院里面,我们可能是对学员里面的戏或者叫专业可以有添加删除便利操作,你这样不是不太,就是你这种继承的关系去实现管理,其实是有点格格不入的。所以说我们解决方案呢,应该是这样做,把学校、院还有系呢,都看成是组织结构,他们的地位是相等的。而他们也定位相等,显然就没有基层关系了,而把它看成一个塑形结构,如果干成一个树形结构呢,我们就可以更好的实现管理,而这个时候就引出了组合模式,那现在我们来看看,如果用组合模式来处理,他会怎么去想这个事呢?来看一下。
03:15
首先呢,我们来看一下组合模式的基本介绍,组合模式也叫composite part,也叫部分与整体的一种模式,它就叫部分整体模式,也就说同学们如果以后听到有人说部分整体模式,其实指的就是组合模式,因为组合模式它描述的就是一个部分。和我们整体的一个关系。哎,这个就是我们组合模式的精髓,它创建了对象组的一种树形结构,将对象组合成树状结构,以表示整体和部分的层次关系。那么组合模式依据树形结构来组合我们的对象。用来表示部分与整体的城市,所以说从这地方来看呢,我们组合模式仍然是一种什么呀,结构性的,它重点是在在一个软件组织结构的形式来讨论我们应该怎么去写代码,或者说应该怎么去设计这个功能模块的。
04:13
那同学看,组合模式使得用户对单个对象的组呃单个对象和组合对象的访问具有一致性,即组合能够让客户以一致性的方式来处理个别的对象和组合对象。好,这个呢,听起来还是比较抽象,我说了任何一个模式用用这个语言来描述啊,都很抽象,所以说呢,我们还是画了一个图来描述一下他们之间的关系,跟上我的思路。现在我们来看一下组合模式的一个原理类图,从这里我们可以看出来,在这个组合模式里面出现了这样几个角色,一个是component component。Compos,还有一个叫live叶子节点,还有还有一个叫composite composite呢是他的一个组合,组合好,那现在呢,我们对这一个组合模式的原理进行一个简单的说明,来看一下,我这写几句话啊,那为了好看呢,我先把。
05:10
它的一个背景颜色改一下。好,我们来对这这个组合模式的原理类图呢做几点说明,首先我们先来看你们大家看到的第一个就composite。Component component。那这个component它是表示什么呢?注意听这是。OK,这是组合中组中的一个对象。对象生命接口。生命接口OK,那这在适当的情况下。适当的情况下干什么呢?OK,实现它会实现所有类,所有类干什么呀,共有的接口。
06:02
接口默认行为。也就是他是一个,呃,他是一个,把它该有的行为写出来,你看同学们是不是大致能看到,这里面有爱,有remove,有get get child。也就是说你下面对这个院系的添加删除,或者对子节点的接收呢,我会把它这个在这里面声音声明声明起来。生命型的,那么那生命这个行为是声明什么呢?它其实是用于啊,用于访问和管理。它是用于访问和管理什么呢?用于访问和管理component。Compo。It come。Poland。Component,它是用于访问和管理。component什么呀?只部件。只部件。部件啊部件。也就是说关于它下面的这个子类。
07:02
啊,当然我们要说明一点,就是这个component呢,它可以是一个抽象类,也可以是个接口。就是他可以是就是说就是这个component。这个component可以是。可以是抽象类。或者接口。能理解啊,能理解,因为它它是一个抽象层。我把这个字体放小一点。好,紧接着我们继续来说下一点,那下面呢,我们来分析一下这个力。这个内是个leaf,它是个什么东西呢?同学们,它是在组合。它在这个组合模式中啊,它表示在组合中,它它表示的是什么呢?各位,它表示的是叶子节点。它表示叶节点,那么注意这个叶子节点下面呢,就不会再有子节点了,所以它已是最后这个节点,因此它里面呢,不会有相应的方法,就他是被管理者,就好像在我们这个里面,谁是业绩节点呢,专业,因为专业下面不能再分了。
08:08
我们说学校下面有学院,学院下面有我们的专业,专业在下或者叫系,系下面就没有了吧,所以说它是什么呢?它是叶子节点,它是叶子节点就没有,就没有子节点了。OK啊,那我们再来看最后这个composite,这个是什么东西呢?Comp s OK,这个他在组合中呢,它是定义,它是一个非叶子节点,我们叫做非叶子节点,那这个非叶子节点它是用来干什么呢?它是用来存储,注意听之啊,它用于用于存储什么呀,我们的子部件。存储我们只不变,那么在我们这个component这个接口中,就是在这个component。接口接口中干什么呢?呃,它会在这个component接口中实现。
09:03
他会中。中干什么呀?实现什么呢?实现子部件部件的相关操作。相关操作,比如爱的方法,比如说增加。因为你这个composite呢,它是一个非叶子,它下面还管理一些叶子呢,比如他可能会有增加的方法。它用来管理的,然后呢,比如说删除。等操作。大家待会儿可以看到,你如果认真观察,你会发现这个我这画的一个图呢,有点不清晰,你看他在这里面就会把上面的爱的。人。Get。操作都怎么样,都要去给他进行一个实现。OK,好,那么这个地方就是非叶子,非非叶子电流呢,就就具体的来实现呢,这里面的相关的操作,所以说我这写的组合可以操作只节点的业绩点,但可能不具有叶子的某些行为,就说他这个地方就充当了一个管理者。
10:06
通态管理者。OK,那这边呢是被管理的,就是它是最下面的这一层,就好像如果说如果说这个是最上面这个学校的话,这个这个下面就是下一层,这个这个就是我们的戏或者是专业,好,这是对我们组合模式的一个说明。那下面我们再来看组合模式,它用于解决怎样的问题呢?组合模式它主要是解决这样的问题,当我们要处理的对象可以生成一个树形结构的时候,尤其是像这种组织结构,学院院系等等。而我们要对树上的节点和叶子进行操作的时候,它能够提供统一的方式,你看我在这里热,这是一个最顶级的,那下面呢?这个地方看到没有,这个就是相当于composite,它下面有它的子节点。这个时候,他可以通过一个统提供统一的一种管理方式,而不用考虑它是叶子还是。
11:06
还是这个是节点还是个叶子,这就是我们这画的这个类似的一个图,好的同学们,那关于组合模式的它的一个理论的东西,我们就先说到这里,那待会儿呢,我们用这个组合模式来解决前面提到的哪一个问题呢?就是在一个页面中,在一个页面中我们能够展示出学校的组成,而且呢,这个里面可能会有一些添加的方法,比如说我对一个院系,一个一个专业或者是一个系要进行添加或者移除,我们都会在这一个组合模式中。给他体现出来好,同学们关于组合模式的理论的部分就先聊到这。
我来说两句